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 0Sample Output:
6 3 8 1 5 7 9 0 2 4
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<iostream>
#include<queue>
#include<math.h>
using namespace std;
int compare(const void *a,const void *b){
return *(int *)a-*(int*)b;
}
typedef struct Node{
int val;
Node *left;
Node *right;
}Node;
void build_tree(int *num,int len,Node **r){
if(len>0){
int i,high;
for(i=0;i<1000;i++){
if((int)pow(2.0,i)-1>len){
high=i;
break;
}
}
int ct=(int)pow(2.0,high-1)-1;
int remain=len-ct;
int last_need=(int)pow(2.0,high-1);
int left,right;
if(remain>last_need/2)
left=(ct-1)/2+last_need/2;
else
left=(ct-1)/2+remain;
right=len-left-1;
Node * root= new Node;
*r=root;
root->left=NULL;
root->right=NULL;
root->val=num[left];
if(left>0)
build_tree(num,left,&root->left);
if(right>0)
build_tree(num+left+1,right,&root->right);
}
}
void print_tree(Node *root){
if(root!=NULL){
queue<Node*> q;
q.push(root);
printf("%d",root->val);
while(!q.empty()){
Node* node=q.front();
if(node!=root)
printf(" %d",node->val);
if(node->left!=NULL)
q.push(node->left);
if(node->right!=NULL)
q.push(node->right);
q.pop();
}
}
}
int main()
{
int n,i;
scanf("%d",&n);
int *num=new int[n];
for(i=0;i<n;i++){
scanf("%d",&num[i]);
}
qsort(num,n,sizeof(int ),compare);
Node *root=NULL;
build_tree(num,n,&root);
print_tree(root);
return 0;
}