二叉排序树:又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。
1、若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值。
2、若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。
3、它的左、右子树也分别为二叉排序树。
为什么需要二叉排序树?构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除关键字的速度。
二叉排序树删除结点分三种情况:1、叶子节点2、仅有左或者右子树的结点3、左右子树都有结点,用待删除结点的前驱结点替换待删除结点。
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
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)
SearchBST(T->lchild, key, T, p);
else
SearchBST(T->rchild, key, T, p);
}
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)
*T = s;
else if (key < p->data)
p->lchild = s;
else
p->rchild = s;
return TRUE;
}
else
return FALSE;
}
Status DeleteBST(BiTree *T, int key)
{
if (!*T)
return FALSE;
else
{
if (key == (*T)->data)
Delete(T);
else if (key < (*T)->data)
DeleteBST(&(*T)->lchild, key);
else
DeleteBST(&(*T)->rchild, key);
}
}
Status Delete(BiTree *p)
{
BiTree q, s;
if ((*p)->rchild == NULL)
{
q = *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 (*p != q)
q->rchild = s->lchild;
else
q->lchild = s->lchild;
free(s);
}
return TRUE;
}