<JAVA>一文搞懂红黑树

1. 红黑树简介

红黑树是一种特殊的二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树)。

红黑树在很多地方都有应用,例如:

1. Java中的TreeMap和TreeSet
2. 数据库中的索引实现

2. 红黑树的特性

红黑树有以下五个重要的性质:

1. 每个节点要么是红色,要么是黑色。
2. 根节点必须是黑色。
3. 每个叶节点(NIL节点,空节点)是黑色的。
4. 如果一个节点是红色的,则它的两个子节点都是黑色的。
5. 对于每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

这些性质确保了红黑树的关键特性:从根到叶子的最长可能路径不多于最短可能路径的两倍长。

3.红黑树的插入

  1. 按照二叉搜索树的规则插入新节点,并将新节点着色为红色。
  2. 插入的节点默认是红色的,从插入的新节点开始,向上回溯,检查是否违反红黑树的性质,如果违反则进行调整。
  3. 调整过程主要分为以下几种情况:
    1.如果插入的是根节点,直接将其染成黑色。
    2. 如果父节点是黑色,不需要调整。
    3. 如果父节点是红色,叔叔节点也是红色,就将叔叔父亲爷爷节点变色,爷爷变成插入节点继续向上判定是否违反了红黑树的性质

4.如果父节点是红色,叔叔节点是黑色或不存在:

以下分为(LL,RR,LR,RL)

将爷爷节点右旋,然后和父亲节点一起变色。

将爷爷节点左旋,然后和父亲节点一起变色

先做旋爷爷的左孩子节点(父亲节点)再右旋。得到: 

再将旋转中心点和爷爷节点变色

先右旋右孩子再左旋爷爷节点,得到:

再将旋转中心点和爷爷节点变色

4.红黑树的删除

  1. 按照二叉搜索树的方法找到并删除目标节点。
  2. 如果被删除的节点有两个子节点,用其后继节点(右子树中最小的节点)替代它。
  3. 调整树的结构和颜色,以维持红黑树的性质。这是最复杂的部分,需要考虑多种情况:a. 如果被删除的节点是红色,直接删除不会影响红黑树的性质。b. 如果被删除的节点是黑色,需要进行以下调整:
    • 情况1: 被删除节点的替代节点是红色
      将替代节点染成黑色即可。
    • 情况2: 被删除节点的替代节点是黑色
      这种情况最复杂,需要进一步分类讨论:i. 如果当前节点是新的根节点,直接返回。ii. 如果当前节点的兄弟节点是红色:
      • 将兄弟节点染黑,父节点染红
      • 对父节点进行左旋或右旋
      • 继续处理
      iii. 如果当前节点的兄弟节点是黑色,且兄弟节点的两个子节点都是黑色:
      • 将兄弟节点染红
      • 将父节点作为新的当前节点,继续向上处理
      iv. 如果当前节点的兄弟节点是黑色,且兄弟的左子是红色,右子是黑色:
      • 将兄弟节点的左子染黑,兄弟节点染红
      • 对兄弟节点右旋
      • 继续处理
      v. 如果当前节点的兄弟节点是黑色,且兄弟的右子是红色:
      • 将兄弟节点染成父节点的颜色
      • 将父节点染黑
      • 将兄弟节点的右子染黑
      • 对父节点左旋
      • 调整结束
  4. 最后,将根节点染黑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值