手撕红黑树 C 代码


持续更新中
持续更新中
持续更新中

一、插入

1、确定插入的新节点颜色

  • 黑色
    • 无论父节点是什么颜色,都会破坏 “任一节点到其所有后代外部节点的简单路径上,黑色节点的数量都相同” 这一性质
  • 红色
    • 如果父节点是红色,会破坏 “根节点到所有外部节点的简单路径上,没有两个连续的红色节点” 这一性质
    • 如果父节点是黑色,插入新节点后仍是红黑树,不需要调整

综上,插入红黑树的新节点都是红色的

2、调整不平衡的红黑树

  • 插入的新节点是根节点:直接将红色改为黑色即可
  • 插入的新节点不是根节点,并且其父节点是红色的失衡情况如下:
    • LLr
    • LLb
    • LRr
    • LRb
    • RLr
    • RLb
    • RRr
    • RRb

2.1、详解 8 种失衡

2.1.1、LLr

在这里插入图片描述
其中,x 是插入的新节点,px 是 x 的父节点,ux 是 x 的叔叔节点,gx 是 x 的祖父节点

LLr:

  • 第一个 L:插入的新节点的父节点是 gx 的左孩子
  • 第二个 L:插入的新节点是 px 的左孩子
  • r:插入的新节点的叔叔节点是红色的
2.1.2、LLb

在这里插入图片描述
其中,x 是插入的新节点,px 是 x 的父节点,ux 是 x 的叔叔节点,gx 是 x 的祖父节点

LLb:

  • 第一个 L:插入的新节点的父节点是 gx 的左孩子
  • 第二个 L:插入的新节点是 px 的左孩子
  • r:插入的新节点的叔叔节点是黑色的
2.1.3、LRr

在这里插入图片描述
其中,x 是插入的新节点,px 是 x 的父节点,ux 是 x 的叔叔节点,gx 是 x 的祖父节点

LRr:

  • L:插入的新节点的父节点是 gx 的孩子
  • R:插入的新节点是 px 的右孩子
  • r:插入的新节点的叔叔节点是红色的
2.1.4、LRb

在这里插入图片描述
其中,x 是插入的新节点,px 是 x 的父节点,ux 是 x 的叔叔节点,gx 是 x 的祖父节点

LRb:

  • L:插入的新节点的父节点是 gx 的左孩子
  • R:插入的新节点是 px 的右孩子
  • b:插入的新节点的叔叔节点是黑色的
2.1.5、RLr

在这里插入图片描述

2.1.6、RLb

在这里插入图片描述

2.1.7、RRr

在这里插入图片描述

2.1.8、RRb

在这里插入图片描述

2.2、平衡方法

2.2.1、LXr(LLr + LRr)

以 LLr 为例
在这里插入图片描述

2.2.2、LLb

在这里插入图片描述

2.2.3、LRb

先将 LRb 变为 LLb,再按照 LLb 的操作调整平衡
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值