题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805367987355648
题意
给出一棵树的对应结构以及一组数字,我们需要将这组数字放入二叉树中并保证最终的树是二叉搜索树(左小右大)
代码解析
二叉搜索树的中序遍历(左根右)是一个升序序列,所以我们通过dfs获取到这个表示位置的升序序列后,将其与排序后的原数组通过val进行匹配
最终通过bfs实现层序遍历
AC代码
#include<bits/stdc++.h>
using namespace std;
struct Node{
int l=-1,r=-1;
}node[105];
unordered_map<int,int> val;
vector<int> ans;
void dfs(int root)
{
if(node[root].l!=-1) dfs(node[root].l);
ans.push_back(root);
if(node[root].r!=-1) dfs(node[root].r);
}
void bfs(int root)
{
queue<int> q;
q.push(root);
int flag=1;
while(q.size())
{
int t=q.front();
q.pop();
if(flag) flag=0;
else cout<<" ";
cout<<val[t];
if(node[t].l!=-1) q.push(node[t].l);
if(node[t].r!=-1) q.push(node[t].r);
}
}
int main()
{
int n,root=0;
cin>>n;
for(int i=0;i<n;i++)
{
int x,y;
cin>>x>>y;
node[i].l=x;
node[i].r=y;
}
int a[n];
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
dfs(root);
for(int i=0;i<n;i++) val[ans[i]]=a[i];
bfs(root);
}