题目:https://www.patest.cn/contests/pat-a-practise/1099
题意:给出二叉搜索树上点之间的关系,即每个点从0到n-1编号,给出的它的两个子节点,没有用-1表示。然后给出数量等于二叉树点数的数,把这些数正确的放到给定的二叉搜索树上,按层次遍历输出二叉搜索树
思路:已知二叉搜索树的中序遍历就是一个从小到大的序列,于是可以把给的数从小到大排序,然后中序遍历二叉树,遍历到每个点时赋值即可。最后层次输出就好了
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
struct node
{
int l, r, v;
}g[N];
int arr[N];
int res[N], k;
void dfs1(int v, int &cnt) //中序遍历赋值
{
if(v != -1)
{
dfs1(g[v].l, cnt);
g[v].v = arr[cnt++];
dfs1(g[v].r, cnt);
}
}
void bfs(int v) //层次遍历
{
queue<int> que;
que.push(v);
while(! que.empty())
{
int v = que.front(); que.pop();
res[k++] = g[v].v;
if(g[v].l != -1) que.push(g[v].l);
if(g[v].r != -1) que.push(g[v].r);
}
}
int main()
{
int n, a, b;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d %d", &a, &b);
g[i].l = a, g[i].r = b;
}
for(int i = 0; i < n; i++)
scanf("%d", arr + i);
sort(arr, arr + n);
int cnt = 0;
dfs1(0, cnt);
k = 0;
bfs(0);
for(int i = 0; i < k; i++)
printf("%d%c", res[i], i == k - 1 ? '\n' : ' ');
return 0;
}