首页 > 编程知识 正文

红黑树与平衡二叉树(b树和红黑树区别)

时间:2023-05-05 11:34:54 阅读:1055 作者:355

来源:微信官方账号ytao,

作者ytao

你虐待她上千次,却还是要像对待初恋的红黑树一样对待她。你既高兴又害怕她吗?别担心,通过这篇文章,我希望你会受到前所未有的感动。

红树也是二叉查找树,但它比普通的二叉查找树有更多的特点和条件,每个节点都有红色或黑色的标记。因为它是二进制查找树,所以它具有二进制查找树的所有特征。红树林是一种自平衡的二叉查找树,在插入极端数据条件(正序或闪回)时不会退化为链状数据,可以更高效地在O(log(n))时间内完成搜索、插入和删除操作。

准备

在看这篇文章之前,建议先看我上一篇文章《二叉查找树的解读和实现》,重复的点这里就不解释了,可以更好的帮助大家理解红黑树。

00-1010节点为红色或黑色,根节点必须为黑叶节点(协议为空)。从任何节点到叶节点的每条路径上的黑节点数量相等。不允许连续两个节点都是红色的,也就是说父节点和子节点不能都是红色的。

特性

红黑树的搜索方法和上一篇文章描述的原理是一样的,这里不再赘述。我们将使用节点[38,20,55]

查找

红黑树插入和删除可以分为很多情况,相对比较复杂。插入或删除新节点后的树必须满足二叉查找树的上述五个特征,因此需要通过不同的方式调整树。但是普通的操作和普通的二进制查找树操作是一样的。

例如,在普通插入中,由于每个节点只能是红色或黑色,我们定义新添加的非根节点的默认颜色为红色。新节点被定义为红色的原因是为了满足特征4(从任何节点到叶节点的每条路径上的黑节点数量相等),否则,多一个黑节点就会打破规则。

现在将节点10插入树中。

从图中可以看出,父节点15是黑色节点。插入红色节点10不会增加黑色节点的数量,其他规则不受影响。因此,当插入节点的父节点为黑色时,会直接插入树中,不会破坏原有红黑树的规则。

这种情况的代码实现:

节点对象

实施操作

看到这个代码,是不是觉得很熟悉?是的,这是带有颜色限制的最后一篇文章的插入操作。删除也是如此,这里就不赘述了。

00-1010为了更好地分析变色的原因,我们提取了树中的50个节点作为根节点,如图所示:

将节点55添加到树中,得到如图所示的树:

此时55、60为红色节点,不符合红黑树的特征(连续两个节点不允许为红色)。这时,我们需要调整和使用颜色变化。

当父节点60变成黑色时,它不符合红黑树的特征(从任何节点到叶节点的每条路径上的黑色节点数量相等),因为我们添加了黑色节点60和一个以上的黑色节点。

此时,节点70必须是黑色的,因为原始父节点60是红色的。将节点70变成红色满足节点70的左子树,但是由于节点70变成红色的影响,右子树缺少黑色节点。正如节点90是红色的一样,它可以变成黑色,以满足节点70的右子树要求。

这个特例处理起来比较简单,只需要换个颜色就可以处理。

1?from=pc">

这种条件结构的红黑树实现:

旋转

当仅仅通过变色无法解决我们需要满足特性时,我们就要考虑使用红黑树的旋转。旋转在插入和删除中,会频繁用到该操作,为了满足我们的五条特性,通过旋转可以生成一颗新的红黑树,旋转分为左旋转和右旋转。

左旋转

左旋转为逆时针的旋转,类似于把父结点往左边拉(可以这么记忆区分左右旋转的方向),变换如图:

右旋转

右旋转与左旋转出方向相反外,其他都一样,变换如图:

从图中可以看出,旋转后的父子结点,关系对调了,同时子结点的子结点给了父结点。

如果是左旋转,那么父结点会成为旋转结点的左子结点;子结点的左子结点会成为父结点的右子结点。

如果是右旋转,那么父结点会成为旋转结点的右子结点;子结点的右子结点会成为父结点的左子结点。

听起来比较比较拗口,记住一条规则,左小右大,结合上图两个旋转就比较好理解。用代码实现旋转如下:

旋转变色案例应用

在上面结点为38的红黑中插入结点55。应用前面讲解到的变色后,红黑树结构如图:

此时出现不满足红黑树特性(不允许连续两个结点都为红色),这时需要我们将结点50和结点38进行左旋转,得到如下图:

根结点50不符合红黑树特性(根结点必须为黑色),所以先将根结点变为黑色后。

现在得到的红黑树,又出现违背(任一结点到叶子结点的每条路径上黑色结点数量都相等)特性,高大的汽车右树多一个黑色结点,此时将38,20,15,27颜色改变。

这里经过变色旋转完成了上面这课树的操作红黑树的调整。

由于代码篇幅较大,并没有将全部可能情况都考虑进来。相信理解了红黑树的对编码实现不是太大问题。

总结

红黑树的操作是基于普通二叉查找树上加了红黑树的特性,不管是插入还是删除操作,也就是在普通红黑树上进行旋转变色调整树结构,所以在理解红黑树的时候,主要把握旋转,变色,利用旋转变色来满足红黑树的特性,这也是红黑树的精华所在。懂得其原理和设计思想的话,应用到实际中解决问题确实是很不错的设计。当然,红黑树在实际的操作过程中是多变的,复杂的,要完全掌握还是要花点时间来研究的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。