1064 Complete Binary Search Tree (30 分)

题意

给出N个非负整数,要用它们构建一棵完全二 叉排序树。输出这棵完全二叉排序树的层序遍历序列。

思路

  1. 如果使用数组来存放完全二叉树,那么对完全二叉树当中的任何一个结点(设编号为x,其中根结点编号为1),其左孩子结点的编号一定是2x,而右孩子结点的编号一定是2x+1。那么就可以开一个数组tree[maxn],其中tree[1] ~ tree[n]按层序存放完全二叉树的n个结点,这个数组就存放了一棵完全二叉树,只不过暂时还没有为其元素进行赋值。
  2. 考虑到对一棵二叉排序树来说,其中序遍历序列是递增的,那么思路就很清晰了:先将输入的数字从小到大排序,然后对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;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14454984.html