C++ 数据结构算法 学习笔记(22) - 红黑树

C++ 数据结构算法 学习笔记(22) - 红黑树

红黑树定义

定义 - 是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:

  1. 节点是红色或黑色;
  2. 根节点是黑色;
  3. 所有叶子节点都是黑色节点(NULL);
  4. 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连 续的红色节点。)
  5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点

在这里插入图片描述

为什么有了二叉树,我们还需要红黑树?

下面的二叉树可以达到很好的搜索效果
在这里插入图片描述

我们再看看下面这棵树,我们将下面的数据按从左至右的顺序构造一棵二叉搜索树

在这里插入图片描述

按照之前我们二叉搜索树构建构建的方式,我们将得到下面这样一棵树

在这里插入图片描述

如果我们查找值为 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 必须有两个黑色子节点的规则,因此还得进一步向上调整,此时,要保障红黑树的平衡,我们需 要对根节点进行右旋!

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值