二叉排序樹:又稱爲二叉查找樹。它或者是一棵空樹,或者是具有下列性質的二叉樹。
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;
}