题意
给出N个非负整数,要用它们构建一棵完全二 叉排序树。输出这棵完全二叉排序树的层序遍历序列。
思路
- 如果使用数组来存放完全二叉树,那么对完全二叉树当中的任何一个结点(设编号为x,其中根结点编号为1),其左孩子结点的编号一定是2x,而右孩子结点的编号一定是2x+1。那么就可以开一个数组tree[maxn],其中tree[1] ~ tree[n]按层序存放完全二叉树的n个结点,这个数组就存放了一棵完全二叉树,只不过暂时还没有为其元素进行赋值。
- 考虑到对一棵二叉排序树来说,其中序遍历序列是递增的,那么思路就很清晰了:先将输入的数字从小到大排序,然后对tree数组表示的二叉树进行中序遍历,并在遍历过程中将数字从小到大填入数组,最后就能得到一棵完全二叉排序树。而由于tree数组就是按照二叉树的层序来存放结点的,因此只需要将数组元素按顺序输出即为层序遍历序列。
const int N=1010;
int tree[N];
int a[N];
int n;
int k;
void inorder(int root)
{
if(root*2 <= n) inorder(root*2);
tree[root]=a[k++];
if(root*2+1 <= n) inorder(root*2+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<<' '<<tree[i];
else cout<<tree[i];
cout<<endl;
//system("pause");
return 0;
}