C++ 数据结构算法 学习笔记(22) - 红黑树
红黑树定义
定义 - 是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:
- 节点是红色或黑色;
- 根节点是黑色;
- 所有叶子节点都是黑色节点(NULL);
- 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连 续的红色节点。)
- 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点
为什么有了二叉树,我们还需要红黑树?
下面的二叉树可以达到很好的搜索效果
我们再看看下面这棵树,我们将下面的数据按从左至右的顺序构造一棵二叉搜索树
按照之前我们二叉搜索树构建构建的方式,我们将得到下面这样一棵树
如果我们查找值为 3 的节点,9 个节点需要比较的次数
同样的数据,如果我们按照以下顺序构造一棵二叉排序树:
则查找值为 3 的节点,9 个节点需要比较的次数是3次
为什么两者达到了如此之大的差距,原因是第一棵树左右不够平衡,导致出现比较极端的情况。
解决方法:使用红黑树
红黑树构建
以上例数组为例构建红黑树:
第一步:使用第一个元素 15 创建根节点,根节点一定是黑色,如图:
第二步: 将 13 加入到红黑树,按照二叉搜索树的规则,13 应插入到 15 的左子节点上面,此时插入红色节点不会破坏红黑 树的平衡,直接插入即可,如图
第三步:将 16 加入到红黑树,16 应插入到 15 的右子节点上面,此时插入红色节点不会破坏红黑树的平衡,直接插入即 可,如图所示
第四步: 将 11 加入到红黑树,11 应插入到 13 的左子节点上面,此时继续插入红色节点会破坏红黑树的平衡规则,红色 节点下必须是一对黑色子节点,而插入黑色节点也违背了规则 5(从任一节点到其每个叶子的所有简单路径都包含相同数 目的黑色节点),所以必须进行如下特殊处理
将 11 的父节点 13 和叔父节点都设置为黑色
第五步:将 9 加入到红黑树,9 应插入到 11 的左子节点上面,此时无论插入红色节点或黑色节点都会破坏规则,必须对节 点做乾坤大挪移处理
第六步: 将 7 加入到红黑树,7 应插入到 9 的左子节点上面,此时无论插入红色节点或黑色节点都会破坏规则,必须对节点做变色处理
第七步: 将 5 加入到红黑树,5 应插入到 7 的左子节点上面,此时无论插入红色节点或黑色节点都会破坏规则,必须对节 点做旋转处理
第八步:将 3 加入到红黑树,3 应插入到 5 的左子节点上面,此时无论插入红色节点或黑色节点都会破坏规则,我们先对父节点和叔叔节点做变色处理
但这样破坏了红色节点 11 必须有两个黑色子节点的规则,因此还得进一步向上调整,此时,要保障红黑树的平衡,我们需 要对根节点进行右旋!