建立一个二叉排序树,根据给定值对其实施查找。
二叉排序树的二叉链表存储表示:
typedef int ElemType;
typedef struct BSTNode
{
ElemType data;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
输入格式:
第一行输入二叉排序树中结点的值,以-1
结束。用逐个插入的方式创建二叉排序树。
第二行输入一个要查找的值。
输出格式:
找到,输出have found!
。接着空一格,输出该结点左孩子值,后再空一格,输出该结点右孩子的值。如果孩子为空,对应位置输出NULL
。
如果没有找到,输出NOT FOUND!
。
输入样例:
10 18 3 8 20 2 7 -1
3
输出样例:
have found! lchild:2 rchild:8
输入样例:
10 18 3 8 20 2 7 -1
8
输出样例:
have found! lchild:7 rchild:NULL
输入样例:
10 18 3 8 20 2 7 -1
5
输出样例:
NOT FOUND!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码:
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct BSTNode
{
ElemType data;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
BSTree craeteB(){
BSTree T;
T=(BSTree)malloc(sizeof(BSTNode));
T->lchild=NULL;
T->rchild=NULL;
scanf("%d",&T->data);
while(1){
int n;
scanf("%d",&n);
if(n==-1) break;
BSTree Q=T;
while(1){
if(n>Q->data){ //比结点的值大,放右边
if(Q->rchild!=NULL) //右边还有结点
Q=Q->rchild;
else{
BSTree p; //右边没有结点了
p=(BSTree)malloc(sizeof(BSTNode));
p->lchild=NULL;
p->rchild=NULL;
p->data=n;
Q->rchild=p;
break;
}
}else{//比结点的值小
if(Q->lchild!=NULL) //左边还有结点
Q=Q->lchild;
else{
BSTree p; //左边没有结点了
p=(BSTree)malloc(sizeof(BSTNode));
p->lchild=NULL;
p->rchild=NULL;
p->data=n;
Q->lchild=p;
break;
}
}
}
}
return T;
}
void found(BSTree T,int n){
BSTree Q=T;
while(1){
if(n==Q->data){
printf("have found! lchild:");
if(Q->lchild!=NULL)
printf("%d rchild:",Q->lchild->data);
else
printf("NULL rchild:");
if(Q->rchild!=NULL)
printf("%d",Q->rchild->data);
else
printf("NULL");
break;
}
if(n>Q->data){
if(Q->rchild!=NULL)
Q=Q->rchild;
else{
printf("NOT FOUND!");
break;
}
}
if(n<Q->data){
if(Q->lchild!=NULL)
Q=Q->lchild;
else{
printf("NOT FOUND!");
break;
}
}
}
}
int main(){
BSTree T;
T=craeteB();
int n;
scanf("%d",&n);
found(T,n);
return 0;
}