您的位置:首页 > 其它

04-树6 Complete Binary Search Tree(30 point(s))

2017-10-25 15:44 585 查看
题目位置

分析:

题目要求为:完美二叉树 + 搜索树 可以唯一确定一颗 二叉树。

因 涉及到完美二叉树 那题目就简单的 多的多了。

我们知道 搜索树的由来 是由 二分查找法 步骤图 而来,二分查找法的要求 是 必须用数组 存储 有序字符,我们还知道 完美二叉树也是可以通过数组进行存储,这个题说到这里,已经可以迎刃而解了。

完美二叉树 有 如下特点供我们使用:

1、N个结点 最大树高为 :log2 n 取整 + 1

2、给定结点 后 可知 左右子树结点个数。

左:

2 的 (MaxHeight(N)-2 )次方 – 1

如果【N – {2 的 (MaxHeight(N)-2 )次方 – 1 }*2-1 >= 2 的 (MaxHeight(N)-2)次方】

则+2 的 (MaxHeight(N)-2)次方

否则 + N – {2 的 (MaxHeight(N)-2 )次方 – 1 }*2 – 1



右:N-左 得右

二叉搜索树 有 如下特点供我们使用

1、因为 从大到小 根据一定规则排序,如果知道 左右子树结点个数,即可唯一确定这个根结点的数值。

故根据如上 特性 即可解决此题。

level traversal 利用queue 解决。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct BinTree *Tree;
struct BinTree{
int data;
Tree left;
Tree right;
};
int MaxHeight(int N);
Tree CBST(int *a,int Left,int right);
int LeftNodeNum(int N);
int compare(const void *elem1,const void *elem2);
Tree deleteQue(Tree *queue,int *front,int *rear,int N);
void insertQue(Tree *queue,int *rear,Tree T,int N);
int main(){
int N;
scanf("%d",&N);
int i,j;
int a
;
for(i=0;i<N;i++){
scanf("%d",&a[i]);
}
qsort(a,N,sizeof(a[0]),compare);
//    int b = LeftNodeNum();
//    printf("%d",b);
Tree T;
T=CBST(a,1,N);
Tree queue
;
int rear  =-1;
int front =-1;
Tree B;
insertQue(queue,&rear,T,N);
i=0;
while(1){
B = deleteQue(queue,&front,&rear,N);
i++;
if(!B)break;
printf("%d",B->data);
if(i!=N)printf(" ");
if(B->left)insertQue(queue,&rear,B->left,N);
if(B->right)insertQue(queue,&rear,B->right,N);
}
}
Tree deleteQue(Tree *queue,int *front,int *rear,int N){
if(*rear==*front)return NULL;
*front = (*front)%N +1;
Tree B = queue[*front];
return B;
}
void insertQue(Tree *queue,int *rear,Tree T,int N){
*rear = (*rear)%N+1;
queue[*rear]=T;
return;
}
Tree CBST(int *a,int Left,int right){
Tree T=(Tree)malloc(sizeof(struct BinTree));
T->left=NULL;
T->right=NULL;
if(Left == right){T->data = a[Left-1];return T;}
int node = Left+LeftNodeNum(right-Left+1);
T->data=a[node-1];
if(node == right){T->left = CBST(a,Left,node-1),T->right=NULL;return T;}
T->left=CBST(a,Left,node-1);
T->right=CBST(a,node+1,right);
return T;
}
int LeftNodeNum(int N){
if(N==1)return 0;
int leftCmpTreeNum = (int)pow(2,MaxHeight(N)-2) -1;
if(N-(leftCmpTreeNum)*2-1>=leftCmpTreeNum+1)
leftCmpTreeNum = leftCmpTreeNum+leftCmpTreeNum+1;
else leftCmpTreeNum =leftCmpTreeNum +N-(leftCmpTreeNum)*2-1;
return leftCmpTreeNum;
}
int MaxHeight(int N){
int i,j;
for(i=0,j=0;i<N;i++){
i = i*2;
j++;
}
return j;
}
int compare(const void *elem1,const void *elem2){
return *(int*)elem1 - *(int*)elem2;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索