数据结构—红黑树(RBT)

300 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

分享知识就像讲故事,故事讲得好,首先需要对剧情了解,然后用于语言结合图将其描述出来。这其实一个挑战,如何把故事讲得有趣,而且还要讲清楚的确是一件不容易的事。

二叉搜索树

在开始介绍红黑树之前,我们简单回顾一下二叉搜索

  • 有序的二叉树
  • 每一个结点有两个子树 不过二叉搜索树有一个问题如果从小到大容易发生退化,退化为一个线性链表,也就是其时间复杂度是不稳定的。

为了解决这个问题引入了平衡二叉树,所以要保持平衡就是为了防止退化的问题。不过因为严格控制了左右子树差高度,为了保持平衡,当插入结点或者删除结点后需要修复不平衡问题。为了解决这个问题才引入了红黑二叉搜索树。

红黑二叉树是一种自平衡二叉树,其平衡性没有平衡二叉树那么好。给每个节点一个额外的信息,就是颜色信息,可以是红色也可以是黑色,因此叫红黑树。

RBT 不需要过多旋转操作来修复二叉树平衡性,所以对于经常有插入操作的数据相比于平衡树更加适合。

如果插入和删除操作不是很频繁情况,更多的操作是查询情况,平衡二叉树则更适合这种情况。

rbt_001.png

首先红黑树也是二叉搜索树,不过需要满足一些要求

  • 每一个结点都会有一个颜色,可以是红色也可以黑色
  • 根结点需要是黑色的
  • 每个叶子节点都是黑色不存储数据的空结点
  • 任意红色结点其子结点必须是黑色,也就是一条路径上不能有两个连续的红色结点(红色属性),也可以理解为红色结点被黑色结点隔开
  • 从一个结点到到所有叶子结点,经过的黑色节点数目是相同的

在我们结束之前,有几个注意事项,

  • 节点需要一个存储位来跟踪颜色,

  • 第二条,最长的路径,即从根到最远的零的路径,不超过最短的路径的两倍,即从根到最近的零的路径,换句话说,最短的路径有所有的黑色节点,最长的路径在红色和黑色之间交替,这是因为我们之前定义的约束,回顾一下我们的例子,你会发现

  • 一条路径上 B 节点数差1倍,左右深度差一倍,这样也就是相对宽松平衡条件。