红黑树是一种自平衡二叉搜索树。由于其良好的特性,红黑树被广泛应用于许多地方,例如C++的STL容器以及Linux的非实时任务调度。本文将对红黑树的原理和各种操作算法进行分析。
1 定义
红黑树的示意图如下:
首先,红黑树必须是一棵二叉搜索树。同时,红黑树必须满足以下5条性质:
性质1:每个结点要么是黑色的,要么是红色的;
性质2:根节点必须是黑色的;
性质3:每个“叶子结点”都是黑色的;
容易混淆的是,这里的“叶子结点”并不是我们通常理解的叶结点,而是指空指针结点NIL,所以我们在很多文章中看到的红黑树是下面这个样子的:
Tips: 个人认为,把NIL结点看做叶子结点非常容易把自己搞晕。。所以这条性质可以理解为这样:如果一个结点的某个子树为空,则假设这个空子树的位置有一个黑色的结点。在后面的红黑树操作分析中,我们可以更好地理解这一条性质。
性质4:如果一个结点是红色的,那么它的两个子结点必须是黑色的;
推论:1. 从任一结点到叶结点的路径上不能出现两个连续的红色结点;2. 红色结点的父结点必须是黑色的。
性质5:对于每个结点,从该结点到子树上叶结点的任意一条路径上,经过的黑色结点数量相同。
这条性质是红黑树最重要的性质,它确保了红黑树中任意一条路径的长度都不会超过其他路径长度的两倍。因此,红黑树是一棵相对接近平衡的二叉树,性能较好。
为了保持这5条性质,我们在插入和删除等操作中需要对红黑树的结构进行相应的调整。
推荐大家看看这个知乎回答:为什么这么多关于红黑树的面试题呢? - 敖丙的回答 - 知乎 https://www.zhihu.com/question/312327402/answer/1560653215
这位大佬比较硬核地解释了红黑树的一些原理,包括2-3-4树模型和红黑树的联系等,看完后会对红黑树有更深的理解!
2 查找 / 搜索
红黑树是一棵二叉搜索树,因此查找操作和普通的二叉搜索树类似,流程如下:
1 | // 搜索值为val的结点 |
3 旋转
在之后对红黑树的结构调整操作中,我们可能需要对某两个结点进行旋转操作,以调节它们的上下关系,使左右子树相对平衡。例如,下面是对结点2进行左旋操作的示意图。注意结点2和结点4的上下关系:
阅读全文 >>