题目
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
The left subtree of a node contains only nodes with keys less than the node’s key.
The right subtree of a node contains only nodes with keys greater than or equal to the node’s key.
Both the left and right subtrees must also be binary search trees.
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.
Input Specification:
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.
Output Specification:
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.
Sample Input:
10
1 2 3 4 5 6 7 8 9 0
Sample Output:
6 3 8 1 5 7 9 0 2 4
代码
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<cmath>
typedef struct TreeNode *CTree;
struct TreeNode{
int v;
CTree left,right;
};
using namespace std;
CTree Insert(CTree T,int v){
if(!T){
T=(CTree)malloc(sizeof(struct TreeNode));
T->v=v;T->left=NULL;T->right=NULL;
}
else{
if(v<T->v) T->left=Insert(T->left,v);
else if(v>T->v) T->right=Insert(T->right,v);
}
return T;
}
CTree Find(CTree T,int v){
if(T->v==v)return T;
else{
if(v<T->v) return Find(T->left,v);
else if(v>T->v) return Find(T->right,v);
else return NULL;
}
}
void CBST(int t[],CTree &T,int start,int n){//分治法
if(!n) return;
int flr=floor(log(n)/log(2));
int zuo,you,root;
if(pow(2,flr)-1<n){//找出左子树结点数和右子树结点数
if(n-(pow(2,flr)-1)<pow(2,flr-1)){
zuo=(pow(2,flr)-2)/2+n-(pow(2,flr)-1);
you=n-zuo-1;
}
else{
zuo=(pow(2,flr)-2)/2+pow(2,flr-1);
you=n-zuo-1;
}
}
else{
zuo=(n-1)/2;
you=zuo;
}
root=start+zuo;//确定根的位置
T=Insert(T,t[root]);//放入二叉树
CBST(t,T,root-zuo,zuo);//处理左子树
CBST(t,T,root+1,you);//处理右子树
}
int main(){
queue<int> q;
CTree T=NULL;
int n;cin>>n;
int t[n];
for(int i=1;i<=n;i++)cin>>t[i];
sort(t+1,t+n+1);
//for(int i=1;i<=n;i++)cout<<t[i];
CBST(t,T,1,n);
q.push(T->v);
CTree R=T;
int flag=0;
while(!q.empty()){
if(flag)cout<<" ";
else flag=1;
T=Find(R,q.front());
if(T->left)q.push(T->left->v);
if(T->right)q.push(T->right->v);
cout<<q.front();
q.pop();
}
return 0;
}