1064 Complete Binary Search Tree (30 分)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
A Complete Binary Tree (CBT) is a tree that is completely filled, with the possible exception of the bottom level, which is filled from left to right.
Now given a sequence of distinct non-negative integer keys, a unique BST can be constructed if it is required that the tree must also be a CBT. You are supposed to output the level order traversal sequence of this BST.
Each input file contains one test case. For each case, the first line contains a positive integer N (≤1000). Then N distinct non-negative integer keys are given in the next line. All the numbers in a line are separated by a space and are no greater than 2000.
For each test case, print in one line the level order traversal sequence of the corresponding complete binary search tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
10
1 2 3 4 5 6 7 8 9 0
6 3 8 1 5 7 9 0 2 4
给出一个序列,构建完全二叉查找树,输出其层序遍历的结果
二叉查找树中序遍历所得的结果是有序的,按照从小到大排序。
完全二叉树对于给定数量的结点其形状固定。
根据这一性质,对一个给结点数n,就可以确定其根结点在有序序列里的下标。
首先将序列a按从小到大排序,对于10个结点,可以根据序列的下标构造一棵如下图的完全二叉查找树。
可以看出,根据这棵完全二叉树很容易就能写出其层序遍历。
我们主要的任务就是找到每个结点对应的在有序序列中的下标。
利用递归实现。
对于10个结点,其根结点7,是由一个基址(因为右子树的基址和左子树的基址不同,左子树基址0,右子树基址父节点下标)+其左子树结点的个数+1得到的,
这里基址0,左子树结点个数6,所以0+6+1=7
层序遍历数组下标1的值就为level[1]=a[7]
然后需要分别对根结点7的左子树和右子树进行处理,由于层序遍历,是左子树再右子树前面,左子树根结点的层序下标为2*1,右子树根结点的下标为2*1+1。
左子树结点的个数是根据结点的个数所能构建的完全二叉树的层数height,height从1开始,1层结点总个数2^1-1,2层结点总个数2^2-1,第1层为根结点,对于n个结点的左子树的个数有两种可能情况
所以左子树的个数为min(pow(2,height-1)-1,n-pow(2,height-2))
参考代码
#include
using namespace std;
int level[1010],a[1010];
int findleftnum(int n){
int height=1;
while(pow(2,height)-1>n;
for(i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
create(0,n,1);
for(i=1;i<=n;i++){
if(i!=1) cout<<" ";
cout<