二叉排序树实战分析
题目描述: 输入一棵二叉树,再输入一串权值,将权值填入二叉树的节点中,使得该二叉树成为一棵二叉排序树,层序输出对应权值。如图所示:
题目分析: 二叉排序树(二叉查找树)任意一个节点都满足左子树 < 根 < 右子树,其中序遍历为递增序列。将输入的二叉树进行中序遍历,并填入对应的权值。
运行结果:
代码如下:
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 10010;
struct node{
int data;
int lchild,rchild;
}Node[maxn];
int n,in[maxn];
int num=0;
// 中序遍历并赋予其权值
void InOrder(int root){
if(root==-1)return;
InOrder(Node[root].lchild);
Node[root].data=in[num++];
InOrder(Node[root].rchild);
}
//层序遍历
void BFS(int root){
queue<int> q; //辅助队列
q.push(root);
num=0;
while(!q.empty()){
int now=q.front(); //读队首
q.pop();
cout<<Node[now].data<<" "; // 访问队首元素
if(Node[now].lchild!=-1) q.push(Node[now].lchild);
if(Node[now].rchild!=-1) q.push(Node[now].rchild);
}
}
int main(){
cin>>n; // 输入节点个数
for(int i=0;i<n;i++){ //按序输入每个节点的左右孩子节点
int lchild,rchild;
cin>>lchild>>rchild;
Node[i].lchild=lchild;
Node[i].rchild=rchild;
}
for(int i=0;i<n;i++){ // 输入每个孩子的权
int x;
cin>>x;
in[i]=x;
}
sort(in,in+n);
InOrder(0);
BFS(0);
return 0;
}