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
备注:考察完全二叉搜索树的概念。思路是先排序,然后根据节点个数先确定层数,然后确定在数组中的偏移量,得到key值,再递归地构造左子树和右子树即可。最后用个queue按层输出。
#include<stdio.h> #include<stdlib.h> #include<queue> using namespace std; const int MAXSIZE = 1005; typedef struct node NODE; struct node { int key; NODE *left; NODE *right; }; int a[MAXSIZE]; int compare(const void *a,const void *b) { return (*(int *)a)-(*(int *)b); } NODE* ConstructTree(int n_nodes,int start) { if(n_nodes==0) return NULL; NODE *tempnode = new NODE; if(n_nodes==1) //leaf node { tempnode->key = a[start]; tempnode->left = NULL; tempnode->right = NULL; return tempnode; } // calculate the depth of the tree int depth = 0, n_leaf = 0; int count = 0, i = 1; while(count<n_nodes) { count+=i; i*=2; depth++; } n_leaf = n_nodes-(count-i/2); //count the number of left tree nodes int left_num = 0; i=1; for(int j=1;j<depth-1;j++) { left_num+= i; i=i*2; } if(n_leaf<=i) left_num+=n_leaf; else left_num+=i; //construct the tree recursively tempnode->key = a[start+left_num]; tempnode->left = ConstructTree(left_num,start); tempnode->right = ConstructTree(n_nodes-left_num-1,start+left_num+1); return tempnode; } void LevelOrderOutput(NODE *root) { queue<NODE> q; q.push(*root); while(!q.empty()) { NODE n = q.front(); if(n.left!=NULL) q.push(*n.left); if(n.right!=NULL) q.push(*n.right); q.pop(); if(q.size()==0) printf("%d",n.key); else printf("%d ",n.key); } } int main() { int N; scanf("%d",&N); for(int i=0;i<N;i++) scanf("%d",&a[i]); qsort(a,N,sizeof(int),compare); // Construct the tree NODE* root = ConstructTree(N,0); // Output in level-order LevelOrderOutput(root); return 0; }