A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
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.
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.
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.
10
1 2 3 4 5 6 7 8 9 0
6 3 8 1 5 7 9 0 2 4
首先要明白一点:已知一个序列,构建出来的搜索二叉树为什么不唯一,答案:因为无法确定哪个是根节点。
其次要知道二叉搜索树的一些性质:
二叉树的性质:
本题的二叉搜索树为完全二叉树,我们可以利用其是完全二叉树和结点总数固定的已知条件,确定其根节点(先排序,再计算),进而确定这个唯一的二叉搜索树。
#include
#include
#include
#include
using namespace std;
vector in, level;
void levelorder(int start, int end, int index) {
if(start > end) return ;
int n = end - start + 1;
int l = log(n + 1) / log(2); // 得到二叉树的高度
int leave = n - (pow(2, l) - 1);// 最后一层的叶子节点数
int root = start + (pow(2, l - 1) - 1) + min((int)pow(2, l - 1), leave);
/* pow(2, l - 1) - 1是除了root结点所在层和最后一层外,
左子树的结点个数,pow(2, l - 1) 是l+1层最多拥有的属于根结点左子树的结点个数,
min(pow(2, l - 1), leave)是最后一个结点真正拥有的属于根结点左子树上的结点个数
*/
level[index] = in[root];
levelorder(start, root - 1, 2 * index + 1);
levelorder(root + 1, end, 2 * index + 2);
}
int main() {
int n;
scanf("%d", &n);
in.resize(n);
level.resize(n);
for(int i = 0 ; i < n; i++)
scanf("%d", &in[i]);
sort(in.begin(), in.end());
levelorder(0, n - 1, 0);
printf("%d", level[0]);
for(int i = 1; i < n; i++)
printf(" %d", level[i]);
return 0;
}
本菜鸡的一次错误尝试:
#include
#include
#include
#include
using namespace std;
struct node{
int data;
node *left,*right;
};
int n;
vector in;
void insert(node* &root,int data)
{
if(root==NULL)
{
root=new node;
root->data=data;
root->left=root->right=NULL;
return;
}
if(data < root->data) insert(root->left,data);
if(data > root->data) insert(root->right,data);
}
int num=0;
void bfs(node* root)
{
queue q;
q.push(root);
while(!q.empty())
{
node* top=q.front();
q.pop();
printf("%d",top->data);
num++;
if(numleft !=NULL) q.push(top->left);
if(top->right!=NULL) q.push(top->right);
}
}
int main()
{
int temp;
node* root=NULL;
scanf("%d",&n);
in.resize(n);
for(int i=0;idata=in[temp];
root->left=root->right=NULL;
printf("temp:%d",temp);
for(int i=0;i