Complete Binary Search Tree

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

 解题思路:根据完全二叉树性质找规律

 解题感悟:1、记住vector中的sort和cmath文件中的一些函数很重要

               2、注意特殊情况下输出的格式(本题的特殊情况是只有一个输入的情况)

 1 #include <iostream>
 2 #include <vector>
 3 #include<algorithm>
 4 #include <cmath> 
 5 using namespace std;
 6 int main(){
 7     int n;
 8     cin >> n;
 9     vector<int> v;
10     for (int i = 0; i < n; i++)
11     {
12         int number;
13         cin >> number;
14         v.push_back(number);
15     }
16     sort(v.begin(), v.end());
17     int zhishu = log(n)/log(2);
18     int tichushu = n -pow(2,zhishu)+ 1;
19     vector<int> v1;
20     for (int i = 0; i < tichushu;i++)
21         v1.push_back(v[i * 2]);
22     for (int i = 0; i < tichushu; i++)
23         v.erase(v.begin() + i);
24     int flag = 1;
25     for (int i = 1; i <= zhishu;i++)
26     {
27         for (int j = 0; j < pow(2,i-1);j++){
28             if (flag == 1)
29             {
30                 cout << v[v.size() / pow(2, i) + j * v.size() / pow(2, i-1)];
31                 flag = 0;
32             }
33             else
34             {
35                 cout << " " << v[v.size() / pow(2, i) + j * v.size() / pow(2, i-1)];
36             }    
37         }
38     }
39     for (int i = 0; i < v1.size();i++)
40     {
41         if (flag == 1)
42         {
43             cout<< v1[i];
44             flag = 0;
45         }
46         else
47         cout << " " << v1[i];
48     }
49     return 0;
50 }

 

posted @ 2015-04-13 17:20  lkyssd  阅读(160)  评论(0编辑  收藏  举报