上篇博客,我们使用代码完成了一个简单的红黑树功能,这篇,我补充一下,关于红黑树的相关知识点。
红黑树概述
红黑树是一种自平衡的二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。红黑树具有以下特性:
- 每个节点要么是红色,要么是黑色。
- 根节点是黑色。
- 每个叶节点(NIL节点,空节点)是黑色。
- 如果一个节点是红色,则它的子节点必须是黑色(也就是不存在两个相邻的红色节点)。
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点,这个数目被称为黑色高度。
由于红黑树满足上述性质,它能够保持树的平衡,确保在最坏情况下的查找、插入和删除操作的时间复杂度为O(log n)。红黑树常被用于实现关联数组等数据结构,以及在各种编程语言的标准库中被广泛应用。
使用一组数据来展示红黑树原理
上面说的只是概念,下面咱们举例说明:
当我们向红黑树中插入一组数据时,红黑树会根据插入顺序进行自平衡操作,确保树的结构符合红黑树的性质。假设我们有以下一组数据:{7, 3, 18, 10, 22, 8, 11, 26},我们将按顺序将它们插入到红黑树中。初始时,红黑树为空。
R:红
B: 黑
- 插入7:根节点为黑色,红黑树如下所示(红色节点用R表示,黑色节点用B表示):
7(B)
- 插入3:着色为红色,不需要调整。
7(B)
/
3(R)
- 插入18:着色为红色,不需要调整。
7(B)
/ \
3(R) 18(R)
- 插入10:进行左旋转,然后重新着色。
7(B)
/ \
3(R) 18(R)
/
10(R)
- 插入22:着色为红色,不需要调整。
7(B)
/ \
3(R) 18(R)
/ \
10(R) 22(R)
-
插入8:进行右旋转,然后重新着色。(不想像上面那样搞代码,烦死了)
-
插入11:着色为红色,需要调整,因为18和11都是红色。
-
插入26:着色为红色,需要调整,因为22和26都是红色。