二叉排序树(Binary Sort Tree)又称为二叉查找树,中序二叉排序树得到有序列表,它或者是一棵空树,或者是具有下列性质的二叉树:
若它的左子树不为空,则左子树所有节点的值均小于它的根结构的值。
若它的右子树不为空,则右子树所有节点的值均大于它的根结构的值。
它的左右子树也分别为二叉排序树(递归)。
二叉排序树的查找操作:
//二叉排序树结点结构定义
typedef struct BiTNode
{
int data ;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//递归查找二叉排序树T中是否存在key
//指针f指向T的双亲,其初始值为NULL
//若查找成功,则指针p指向数据元素节点,并返回true
//否则指针p指向查找路径上访问的最后一个节点
Status SearchBST(BiTree T, int key, BiTree f, BiTree *p)
{
if(!T) //查找不成功
{
*p = f;
return FALSE;
}
else if (key == T->data) //查找成功
{
*p = T;
return true;
} else if (key < T->data) //在左子树查找
{
return SearchBST(T->lchild, key, T, p);
}
else {
return SearchBST(T->rchild, key, T, p); //在右子树查找
}
}
//二叉排序树插入操作
//当二叉排序树T中不存在关键字等于key的数据元素
//插入key返回TRUE,否则返回FALSE
Status InsertBST (BiTree *T, int key)
{
BiTree p, s;
if(!SearchBST(T, key, NULL, &p))
{
s = (BiTree)malloc(sizeof(BiTree));
s->key = key;
s->lchild = s->rchild = NULL;
if(!p)
*T = s; //插入s为新的根节点
else if (p->data > key)
{
p->rchild = s; //插入s为右孩子
}
else
p->lchild = s; //插入s为左孩子
return true;
}else {
return false; //树中有相同节点不在插入
}
}
//二叉排序树的删除
Status Delete(BiTree *p)
{
BiTree s, q; //q待删除的上一个节点,双亲节点,s每一次迭代用到的节点
if(NULL == p->rchild) //左子树为空,右子树接过去
{
q = *p;
*p = (*p)->lchild;
free(q);
}
else if(NULL == p->lchild) //右子树为空,左子树接过去
{
q = *p;
*p = (*p)->rchild;
free(q);
}
else { //左、右子树非空,将直接前驱的左子树做为直接前驱的双亲
q = *p;
s = (*p)->lchild;
while(s->lchild) //循环迭代找到直接前驱(左子树最右的那一棵树)
{
q = s;
s = s->lchild; //每次s的右子树直到为NULL
}
(*p)->data = q->data; //替换数据
if(q != *p)
{
q->rchild = s->lchild;
}else {
q->lchild = s->lchild;
}
free(s);
}
return TRUE;
}