-
题目见这里
-
BST结构体中add一个level变量,创建BST时,需要在add结点之前根据将来的父结点得到该结点的level值,然后就是LevelOrder了,从后往前扫描bstQ(结点队列)即可
-
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define N 1005
typedef struct node{
int level;
int data;
struct node *lChild, *rChild;
}BST;
BST* CreatBST(int n){
int i,data;
BST *bst,*bst1,*node;
for(i=1;i<=n;i++){
node = (BST *)malloc(sizeof(BST));
scanf("%d",&(node->data));
node->lChild = node->rChild = NULL;
if(i==1){
node->level = 0;
bst = node; //此处不能赋值bst1
}
else{
bst1 = bst;
while(bst1){ //主要是为了获得下一个结点的level
if(bst1->data<node->data){
if(bst1->rChild==NULL){
node->level = bst1->level + 1;
bst1->rChild = node;
break;
}
else bst1 = bst1->rChild;
}
else{
if(bst1->lChild==NULL){
node->level = bst1->level + 1;
bst1->lChild = node;
break;
}
else bst1 = bst1->lChild;
}
}
}
}
return bst;
}
void Solve(BST *bst, int n){
BST *bstQ[N],*tmp;
int front,rear;
front = rear = 0;
bstQ[rear++] = bst;
while(front<rear){
tmp = bstQ[front++];
if(tmp->lChild) bstQ[rear++] = tmp->lChild;
if(tmp->rChild) bstQ[rear++] = tmp->rChild;
}
int res[2]={0};
int i,level;
i = 0;
front = 0;
level=bstQ[rear-1]->level;
while(rear>front){
if(bstQ[--rear]->level==level) res[i] ++;
else{
i ++;
if(i==2) break;
res[i] = 1;
level = bstQ[rear]->level;
}
}
printf("%d + %d = %d\n",res[0],res[1],res[0]+res[1]);
}
int main(){
// freopen("Data.txt","r",stdin);
BST *bst; //not bst,error:bst.lChild is a bst point
int n;
scanf("%d",&n);
bst = CreatBST(n);
Solve(bst,n);
return 0;
}
阅览时间:
2017-07-25,23:39