题意
给定一个二叉树的形状,要求在给定的序列中放置题目给定的数字序列,要求填入后整棵树符合BST的定义。最后答案要输出层序遍历
思路
- 1⃣️可以肯定的是要利用BST中序遍历有序这个特点来进行填数
- 2⃣️所以现在的问题就是如何根据题目给的数据正确的构造出符合要求的完全二叉树。因为给的是编号,所以考虑用静态写法
代码
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct node{
int left, right;
int val;
} tree[110];
int n;
int cur = 0;
void inorder(int root, vector<int>& seq)
{
if(root == -1) return;
if(root >= n) return;
inorder(tree[root].left, seq);
int val = seq[cur++];
tree[root].val = val;
inorder(tree[root].right, seq);
}//中序遍历放置数字
void bfs(int root, vector<int>& vi)
{
queue<int> q;
q.push(root);
while(!q.empty())
{
int size = q.size();
for(int i=0;i<size;i++)
{
auto cur = q.front();
q.pop();
vi.emplace_back(tree[cur].val);
//如果左右孩子等于-1表示没有孩子
if(tree[cur].left != -1)
q.push(tree[cur].left);
if(tree[cur].right != -1)
q.push(tree[cur].right);
}
}
}
int main()
{
cin >> n;
int l, r;
for(int i=0;i<n;i++)
{
cin >> l >> r;
tree[i].left = l;
tree[i].right = r;
} //读入结点信息
vector<int> seq; //存放题目给的BST的数值序列
int t;
for(int i=0;i<n;i++)
{
cin >> t;
seq.emplace_back(t);
}
sort(seq.begin(), seq.end()); //排序后准备用中序遍历填数
inorder(0, seq); //中序遍历填数
vector<int> level_travel; //存放层序遍历结果
bfs(0, level_travel);
for(int i=0;i<level_travel.size();i++)
i == level_travel.size() - 1 ? cout << level_travel[i] : cout << level_travel[i] << " ";
return 0;
}