小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
分享知识就像讲故事,故事讲得好,首先需要对剧情了解,然后用于语言结合图将其描述出来。这其实一个挑战,如何把故事讲得有趣,而且还要讲清楚的确是一件不容易的事。
二叉搜索树
在开始介绍红黑树之前,我们简单回顾一下二叉搜索
- 有序的二叉树
- 每一个结点有两个子树 不过二叉搜索树有一个问题如果从小到大容易发生退化,退化为一个线性链表,也就是其时间复杂度是不稳定的。
为了解决这个问题引入了平衡二叉树,所以要保持平衡就是为了防止退化的问题。不过因为严格控制了左右子树差高度,为了保持平衡,当插入结点或者删除结点后需要修复不平衡问题。为了解决这个问题才引入了红黑二叉搜索树。
红黑二叉树是一种自平衡二叉树,其平衡性没有平衡二叉树那么好。给每个节点一个额外的信息,就是颜色信息,可以是红色也可以是黑色,因此叫红黑树。
RBT 不需要过多旋转操作来修复二叉树平衡性,所以对于经常有插入操作的数据相比于平衡树更加适合。
如果插入和删除操作不是很频繁情况,更多的操作是查询情况,平衡二叉树则更适合这种情况。
首先红黑树也是二叉搜索树,不过需要满足一些要求
- 每一个结点都会有一个颜色,可以是红色也可以黑色
- 根结点需要是黑色的
- 每个叶子节点都是黑色不存储数据的空结点
- 任意红色结点其子结点必须是黑色,也就是一条路径上不能有两个连续的红色结点(红色属性),也可以理解为红色结点被黑色结点隔开
- 从一个结点到到所有叶子结点,经过的黑色节点数目是相同的
在我们结束之前,有几个注意事项,
-
节点需要一个存储位来跟踪颜色,
-
第二条,最长的路径,即从根到最远的零的路径,不超过最短的路径的两倍,即从根到最近的零的路径,换句话说,最短的路径有所有的黑色节点,最长的路径在红色和黑色之间交替,这是因为我们之前定义的约束,回顾一下我们的例子,你会发现
-
一条路径上 B 节点数差1倍,左右深度差一倍,这样也就是相对宽松平衡条件。