04-树6 Complete Binary Search Tree(30 分)
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
思路
既然是完全二叉树,那么肯定要用数组而不是链表,因为先建二叉搜索树再调整为完全树的话太难实现,由于二叉搜索树的中序输出为一升序序列,可以考虑先建一个长度为n+1的数组作为完全二叉搜索树,根据所给数字建一个最小堆,再建个堆栈,利用堆栈模拟二叉搜索树中序遍历,依次将数组的下标压入堆栈按照出栈顺序将每次出栈的下标对应的数组值赋为最小堆根节点的元素值,也就是最小值,最终将数组元素依次输出就是CBST层序输出的结果。
代码如下:
#include <iostream>
#include <stack>
using namespace std;
const int minData=-5;
struct minHeap
{
int *data;
int Size;
int Capacity;
};
minHeap* Create(int maxSize)
{
minHeap *A=new minHeap;
A->data=new int[maxSize+1];
A->Size=0;
A->Capacity=maxSize;
A->data[0]=minData;
return A;
}
minHeap* Build(minHeap* T)
{
int parent,child,temp,i=T->Size/2;
for(;i>0;i--){
temp=T->data[i];
for(parent=i;parent*2<=T->Size;parent=child){
child=parent*2;
if(child+1<=T->Size
&& T->data[child]>T->data[child+1]){
child++;
}
if(temp<=T->data[child]) break;
else T->data[parent]=T->data[child];
}
T->data[parent]=temp;
}
return T;
}
int Delete(minHeap *T)
{
int parent,child,minItem=T->data[1];
int temp=T->data[T->Size--];
for(parent=1;parent*2<=T->Size;parent=child){
child=parent*2;
if(child+1<=T->Size
&& T->data[child]>T->data[child+1]){
child++;
}
if(temp<=T->data[child]) break;
else T->data[parent]=T->data[child];
}
T->data[parent]=temp;
return minItem;
}
int main() {
int n,num;
cin>>n;
minHeap *T=Create(n);
for(int i=0;i<n;i++){
cin>>num;
T->data[i+1]=num;
}
T->Size=n;
T=Build(T);
int CBST[n+1];
stack<int>s;
int i=1;
while(i<=n || !s.empty()){
while(i<=n){
s.push(i);
i*=2;
}
if(!s.empty()){
num=s.top();
CBST[num]=Delete(T);
s.pop();
i=num*2+1;
}
}
for(int i=1;i<n;i++) cout<<CBST[i]<<' ';
cout<<CBST[n];
delete [] T->data;
delete T;
return 0;
}