#define EQ(a,b) ((a) == (b))
#define LT(a,b) ((a) < (b))
#define LQ(a,b) ((a) > (b))
typedef int ElemType;
typedef struct{
ElemType key;
}SElemType;
typedef struct BiNode{
SElemType data;
struct BiNode *lchild, *rchild;
}BiNode, *BiTree;
BiTree T;
Status CreateDST(BiTree &T,int n){
int i;
ElemType key;
for(i=1;i<=n;i++){
printf("请输入第%d个元素:",i);
scanf("%d",&key);
InseartBST(T,key);
}
return OK;
}
Status SearchBST(BiTree T,ElemType key,BiTree f,BiTree &p){
if(!T){
p=f;
return FALSE;
}
else if(EQ(key,T->data.key)){
p = T;
return TRUE;
}else if(LT(key,T->data.key)){
return SearchBST(T->lchild,key,T,p);
}else{
return SearchBST(T->rchild,key,T,p);
}
}
Status InseartBST(BiTree &T,ElemType key){
BiTree p;
if(!SearchBST(T,key,NULL,p)){
BiTree s;
s = (BiTree)malloc(sizeof(BiNode));
if(!s) return ERROR;
s->data.key = key;
s->lchild = s->rchild = NULL;
if(!p) T = s;
else if(LT(key,p->data.key)) p->lchild = s;
else p->rchild = s;
return TRUE;
}else return FALSE;
}
上面的信息是在我编写二叉排序树创建,查找,插入元素时产生的,产生的原因如下:
BiTree T;//首先声明一个二叉树类型的指针变量,但是变量T只是一个地址,大多数情况下不为NULL.这便是产生上述错误的主要原因(将T赋值为NULL即可)。
CreateDST(T,n); //接着,创建二叉排序树
InseartBST(T,key); // 向排序树中插入元素key
SearchBST(T,key,NULL,p) //在插入元素key之前,要先查找树中是否存在与key相同的元素,不存在才会插入到树中
但是由于变量T不为空,下面本应执行的代码并没有执行:
if(!T){
p=f;
return FALSE;
}
而是执行下面的代码:
else if(EQ(key,T->data.key)){
p = T;
return TRUE;
}else if(LT(key,T->data.key)){
return SearchBST(T->lchild,key,T,p);
}else{
return SearchBST(T->rchild,key,T,p);
}
但是开头只是声明了变量T,并没有为其开辟空间,所以T->data.key是有问题的,最终导致了上面的问题。
故而只需把T赋值为空即可。