#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int KeyType;
typedef struct
{
KeyType key;
};
typedef struct Node
{
DataType data;
struct Node *lchild,rchild;
}BTNode,*BiTree;
/* 查找函数*/
BiTree BSTSearch(BiTree T,DataType x)
{
BTNode *p;
if(T){
p = T;
while(p)
{
if(p->data.key == x.key)
return p;
else if (x.key < p->data.key)
{
p = p->lchild;
}
else p = p->rchild;
}
}
return NULL;
}
/* 插入操作 */
int BSTInsert(BiTree *T,DataType x)
{
BTNode *p,*cur = *T,*parent = NULL ;
while(cur)
{
if(cur->data.key == x.key) return 0;
//函数返回0,说明根节点就是所要找的。
parent = cur; //
if( x.key < cur->data.key )
cur = cur->lchild;
else
cur = cur->rchild;
}
p = (BTNode*)malloc(sizeof(BTNode));
if(p) exit(-1);
p->data = x;
p->lchild = NULL; //上下三条语句:初始化一个待插入结点。
p->rchild = NULL;
if(!parent) *T = p; //是空树
else if( x.key < parent->data.key )
parent->lchild = p;
else
parent->rchild = p;
return 1; //成功插入
}
/* 删除操作 */
int BSTDelete(BiTree *T,DataType x)
{
if(!T) return 0;
if( x.key == (*T)->data.key )
DeleteNode(T);
else if( (*T)->data.key > x.key)
BSTDelete((*T)->lchild);
else
BSTDelete((*T)->rchild);
return 1;
}
void DeleteNode(BiTree *s)
{
BiTree q,x,y;
if( !(*S)->rchild ){ //1、
q = *s;
*s = (*s)->lchild;
free(q);
} //当s没有右子树,直接接上左子树啦~
//↑ 这个也包括了s 是叶子的情况
else if( !(*s)->lchild ){
q = *s;
*s = (*s)->rchild;
free(q);
}else{
x = *s;
y = (*s)->lchild;
while(y->rchild){
x = y;
y = y->rchild;
}
(*s)->data = y->data;
if(x != *s)
x->rchild = y->lchild;
else
x->lchild = y->lchild;
free(y);
}
}
关于删除的讲解 ↓