题目大意:
输入一棵二叉查找树和n个数据,把这n个数据放入这颗树中,输出层次遍历序列。
解题思路:
按照二叉查找树中序遍历的特点(数据从小到大)得到二叉树的中序编号序列并把数据排序后对应插入到节点相应的下标,然后BFS输出层次遍历序列结果。
代码如下:
#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<list>
#include<queue>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
//vector ::iterator it;
//set<int>::iterator iter;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int n,d[150];
struct node
{
int data,lchild,rchild;
}nod[150];
vector<int> in;//保存中序遍历的节点编号序列
void inorder(int root)
{
if(root==-1)return;
inorder(nod[root].lchild);
in.push_back(root);
inorder(nod[root].rchild);
}
void bfs(int root)
{
int num=0;
queue<int> q;
q.push(root);
while(!q.empty())
{
root=q.front();
printf("%d",nod[root].data);
num++;
if(num<n)printf(" ");
q.pop();
if(nod[root].lchild!=-1)q.push(nod[root].lchild);
if(nod[root].rchild!=-1)q.push(nod[root].rchild);
}
}
int main()
{
// std::ios::sync_with_stdio(false);
// cin.tie(0);
// freopen("test.txt","r",stdin);
// freopen("output.txt","w",stdout);
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int lchild,rchild;
scanf("%d %d",&lchild,&rchild);
nod[i].lchild=lchild;nod[i].rchild=rchild;//构建二叉查找树
}
for(int i=0;i<n;i++)scanf("%d",&d[i]);
sort(d,d+n);
inorder(0);//得到中序遍历序列
for(int i=0;i<n;i++) nod[in[i]].data=d[i];//对应赋值
bfs(0);//层次遍历
return 0;
}