二叉排序樹

二叉排序樹:又稱爲二叉查找樹。它或者是一棵空樹,或者是具有下列性質的二叉樹。

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章