二叉排序树(搜索树BST)-详解结点的删除

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉排序树(搜索树BST)-详解结点的删除相关的知识,希望对你有一定的参考价值。

在二叉排序树中删除一个结点时,需保证删除后的二叉树仍然是二叉排序树。为讨论方便,假定被删除结点为p,其双亲结点为f。删除的过程可按下述的两种情况分别处理。
在这里我们用红色三角形表示我们要删除的结点,蓝色表示我们要改变指针的指向,如果蓝色是圆圈,则说明是新根。
(1)如果被删除的结点没有左子树,则只需把结点f指向p的指针改为指向p的右子树。
情况一:
在这里插入图片描述

情况二:
在这里插入图片描述
情况三:
在这里插入图片描述

(2)如果被删除的结点p有左子树,则删除结点p时,从结点p的左子树中选择结点值最大的结点s(其实就是p的左子树中最右下角的结点,该结点s可能有左子树,但右子树一定为空),用结点s替换结点p(把s的数据复制到p中),再将指向结点s的指针改为指向结点s的左子树即可。

情况一:
在这里插入图片描述
情况二:
在这里插入图片描述
代码如下:

bool BinSTree::BSTreeDelete(BinSTreeNode *&bt, KeyType k)
{
	BinSTreeNode *f, *p, *q, *s;
	p = bt;
	f = nullptr;
	while (p && p->key != k)
	{
		f = p;
		if (p->key > k) p = p->lchild;
		else p = p->rchild;
	}
	if (p == nullptr) return false;
	if (p->lchild == nullptr)//(1)
	{
		if (f == nullptr) bt = p->rchild;//情况一
		else if (f->lchild == p) f->lchild = p->rchild;//情况二
		else f->rchild = p->rchild;//情况三
		delete p;
		return true;
	}
	else//(2)
	{
		q = p;
		s = p->lchild;
		while (s->rchild)
		{
			q = s;
			s = s->rchild;
		}
		if (q == p) q->lchild = s->lchild;//情况一
		else q->rchild = s->lchild;//情况二
		p->key = s->key;
		delete s;
		return true;
	}
}

以上是关于二叉排序树(搜索树BST)-详解结点的删除的主要内容,如果未能解决你的问题,请参考以下文章

二叉搜索树(BST)的具体实现

二叉搜索树(BST)的具体实现

模板二叉搜索树(二叉排序树,二叉查找树,BST)

算法小讲堂之二叉排序树|二叉搜索树|BST

二叉排序树(BST)删除节点

二叉搜索树BST