目录
二叉排序树(Binary Sort Tree)又称为二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树:
------若它的左子树不为空,则左子树上所有结点的值均小于它的根结构的值;
------若它的右子树不为空,则右子树上所有结点的值均大于它的根结构的值;
------它的左、右子树也分为二叉排序树(递归)。
一、创建
cpp
//二叉树的二叉链表结点结构定义
typedef struct BiTNOde
{
int data;
struct BiTNode * lchild,*rchild;
}BiTNode, *BiTree;
//递归查找二叉排序树T中是否存在key
//指针f指向T的双亲,其初始值调用值为NULL
//若查找成功,则指针p指向该数据元素结点,并返回TRUE
//否则指针p指向查找路径上访问的最后一个结点,并返回FALSE
Status SearchBST(BiTree T,int key,BiTree f,BiTree *p)
{
if(!T) //查找不成功
{
*p = f;
return FALSE;
}
else if(key == T->data)
{
return SearchBST(T->lchild,key,T,p); //在左子树继续查找
}
else
{
return SearchBST(T->rchild,key,T,p); //在右子树继续查找
}
}
二、插入
cpp
//insertBST
//当二叉排序树T中不存在关键字等于key的数据元素时
Status InsertBST(BiTree *T,int key)
{
BiTree p,s;
if(!SearchBST(*T,key,NULL,&p))
{
s = (BiTree)malloc(sizeof(BiTNode));
s->data = key;
s->lchild = s->rchild = NULL;
if(!p) //查找不到key
{
*T = s; //插入s为新的根结点
}
else if(key < p->data)
{
p->lchild = s; //插入s为左孩子
}
else
{
p->rchild = s; //插入s为右孩子
}
return TURE;
}
else
{
return FALSE; //树中已有关键字相同的结点,不再插入
}
}
三、删除
cpp
Status DeleteBST(BiTree *T,int key)
{
if(!*T)
{
return FALSE;
}
else
{
if(key == (*T)->data)
{
return Delete(T);
}
else if(key < (*T)->data)
{
return DeleteBST(&(*T)->lchild,key);
}
else if(key > (*T)->data)
{
return DeleteBST(&(*T)->rchild,key);
}
}
}
Status Delete(BiTree *p)
{
BiTree q,s;
if((*p)->rchild == NULL)
{
p = *p;
*p = (*p)->lchild;
free(q);
}
else if((*p)->lchild == NULL)
{
q = *p;
*p = (*p)->rchild;
free(q);
}
else
{
q = *p;
s = (*p)->lchild;
while(s->rchild)
{
q = s;
s = s->rchild;
}
(*p)->data = s->data;
if(q != p)
{
q->rchild = s->lchild;
}
else
{
q->lchild = s->lchild;
}
free(s);
}
return tree;
}