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 <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstdio>
#include <cmath>
using namespace std;
struct Node{
int data;
Node *left;
Node *right;
Node(int x):data(x), left(NULL), right(NULL){};
};
bool flag = true;
Node *create(vector<int> tree, int left, int right);
int find_root(int n, int left);
void levelorder(Node *root);
int main()
{
int n, temp;
//freopen("in.txt", "r", stdin);
vector<int> tree;
cin >> n;
for(int i=0; i<n; i++)
{
cin >> temp;
tree.push_back(temp);
}
sort(tree.begin(), tree.end());
Node *root = create(tree, 0, n-1);
levelorder(root);
return 0;
}
void levelorder(Node *root)
{
queue<Node*> myque;
myque.push(root);
while(!myque.empty())
{
Node *temp = myque.front();
if(flag)
{
cout << temp->data;
flag = false;
}
else
cout << " " << temp->data;
myque.pop();
if(temp->left)
myque.push(temp->left);
if(temp->right)
myque.push(temp->right);
}
}
Node *create(vector<int> tree, int left, int right)
{
int n = right-left+1;
if(left > right)
return NULL;
int r = find_root(n, left);
Node *root = new Node(tree[r]);
root->left = create(tree, left, r-1);
root->right = create(tree, r+1, right);
return root;
}
int find_root(int n, int left)
{
int temp = n;
int i = 0, res;
while(temp-pow(2, i) > 0)//得出层数
{
temp -= pow(2, i);
i++;
}
if(temp <= pow(2, i-1))//如果最后一层数量小于一半,这些节点全是左子树,那么左子树数量就是(总子树-最后一层)/2加上最后一层
{
res = (n-1-temp)/2+temp+left;
}
else{
temp -= (temp-pow(2, i-1))*2;//如果大于一半,则有部分是右子树的结点,计算左右子树之差
res = (n-1-temp)/2+temp+left;
}
return res;
}