题目描述
链接
给一串构成树的序列,已知该树是完全二叉搜索树,求它的层序遍历的序列
分析
- 二叉搜索树的性质:左子树<根<右子树,而中序遍历是LDR,所以:中序遍历二叉搜索树得到的序列是从小到大排列的
- 完全二叉树的性质:在数组中的存储顺序是层序遍历完全二叉树的顺序
- 混淆概念:要唯一确定一棵二叉树,一般需要先后序中一个和中序一起。不存在什么中序遍历建立二叉树。根本就不唯一好吧。但是在这里,由于限定了完全二叉搜索树,则可以借助中序遍历来对数组赋值。
- 将题目所给序列进行排序,得到中序遍历顺序。而中序遍历,实质是按照LDR访问根结点。我们可以把访问这个操作改成赋值(nodes[root]=a[len++]) ,从而得到数组中的存储顺序。最后进行输出该顺序,即为层序遍历顺序。
- 总结:排序-->改造中序遍历程序,将访问变成赋值-->得到数组存储顺序-->得到层序遍历顺序
- 完全二叉树:结点为空:(i>n) 结点为叶子:(2i>n)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
int nodes[maxn];
int n,len;
int a[maxn];
void inorder(int root){
if(root > n) return;
inorder(2*root);
nodes[root] = a[len++]; //将访问改成赋值
inorder(2*root+1);
}
int main(){
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
inorder(1);
for(int i=1;i<=n;i++){
if(i==1) cout<<nodes[i];
else cout<<" "<<nodes[i];
}
cout<<endl;
}