题目链接:点击打开链接
题目大意:略。
解题思路:
- 给出“固定结构”的二叉搜索树,然后给出树中的数组,要求还原这棵树;
- 将数组从小到大排列正好是二叉搜索树的中序遍历结果,因此可以借此来还原整棵树;
- 树还原之后,就可以利用队列轻松的进行层序遍历了。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
struct node
{
int val,l,r;
};
int n,k,f;
vector<int> val;
vector<node> tree;
void inOrder(node &rt)
{
if(rt.l!=-1) inOrder(tree[rt.l]);
rt.val=val[k++];
if(rt.r!=-1) inOrder(tree[rt.r]);
}
void bfs(node rt)
{
f=1;
queue<node> q;
while(!q.empty()) q.pop();
q.push(rt);
while(!q.empty())
{
rt=q.front(); q.pop();
if(f){f=0; printf("%d",rt.val);}
else printf(" %d",rt.val);
if(rt.l!=-1) q.push(tree[rt.l]);
if(rt.r!=-1) q.push(tree[rt.r]);
}
}
int main()
{
while(~scanf("%d",&n))
{
tree.resize(n); val.resize(n); k=0;
for(int i=0;i<n;i++) scanf("%d%d",&tree[i].l,&tree[i].r);
for(int i=0;i<n;i++) scanf("%d",&val[i]);
sort(val.begin(),val.end());
inOrder(tree[0]);
bfs(tree[0]);
}
return 0;
}