学习笔记:《程序员小灰》红黑树(Red Black Tree)

1 定义

红黑树(Red Black Tree,RB Tree)是一种自平衡的二叉查找树。

在红黑树的每个节点上都多出一个存储位表示节点的颜色,红色(Red)或者黑色(Black)。

红黑树的特性:

  • 每个节点,或者是黑色,或者是红色;
  • 根节点是黑色;
  • 每个叶子节点都是黑色的空节点(NIL节点);
  • 从任一结点到其每个叶子节点的所有路径,黑色结点数目相同;
  • 从根节点到每个叶子的所有路径,不能存在连续的红色结点。

在这里插入图片描述

2 左旋

对a节点进行左旋,指将a节点的右子节点设为a节点的父节点,即将a节点变成一个左节点。因此左旋意味着被旋转的节点将变成一个左节点,具体流程如图所示。

在这里插入图片描述

3 右旋

对b节点进行右旋,指将b节点的左子节点设为b节点的父节点,即将b节点设为一个右节点。因此右旋意味着被旋转的节点将变成一个右节点,具体流程如图所示。

在这里插入图片描述

4 添加

局面1:新结点(A)位于树根。

自平衡:变色。

在这里插入图片描述

局面2:新结点(B)的父结点是黑色。

自平衡:无需调整。

在这里插入图片描述

局面3:新结点(D)的父结点和叔叔结点都是红色。

自平衡:变色。

在这里插入图片描述

局面4:新结点(D)的父结点是红色,叔叔结点是黑色或者没有叔叔,父结点(B)是祖父结点的左孩子,且新结点是父结点的右孩子。

自平衡:左旋->局面5。

在这里插入图片描述

局面5:新结点(D)的父结点是红色,叔叔结点是黑色或者没有叔叔,父结点(B)是祖父结点的左孩子,且新结点是父结点的左孩子。

自平衡:右旋->变色。

在这里插入图片描述

在这里插入图片描述

5 删除

第一步:替换待删除的节点为替换节点,此时替换节点成为新的待删除节点。

在这里插入图片描述

第二步:根据待删除结点和其唯一子结点的颜色,分情况处理。

情况1,自身是红色,子结点是黑色。

自平衡:无需调整。

在这里插入图片描述

情况2,自身是黑色,子结点是红色。

自平衡:变色。

在这里插入图片描述

情况3,自身是黑色,子结点也是黑色,或者子结点是空叶子结点,分6种子情况:

子情况1,结点2是红黑树的根结点。

自平衡:无需调整。

在这里插入图片描述

子情况2,结点2的父亲、兄弟、侄子结点都是黑色。

自平衡:变色->递归地判断并调整。

在这里插入图片描述

子情况3,结点2的兄弟结点是红色。

自平衡:左旋->变色->子情况4、5、6。

在这里插入图片描述

子情况4,结点2的父结点是红色,兄弟和侄子结点是黑色。

自平衡:变色。

在这里插入图片描述

子情况5,结点2的父结点随意,兄弟结点B是黑色右孩子,左侄子结点是红色,右侄子结点是黑色。

自平衡:右旋->变色->情况6。

在这里插入图片描述

子情况6,结点2的父结点随意,兄弟结点B是黑色右孩子,右侄子结点是红色。

自平衡:左旋->变色。

在这里插入图片描述

6 红黑树与AVL树的比较

红黑树AVL树
子树高度差不超过2倍不超过1
效率查询较慢,增删较快查询较快,增删较慢
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值