红黑树插入、删除结构调整(附JDK10 TreeMap源码注释)

红黑树的5个特性1、 每个节点要么是红色,要么是黑色;2、 根节点为黑色;3、 所有叶节点(NIL节点)都是黑色;4、 每个红色节点的子节点一定是黑色;5、 从任一节点到其子树中的每个叶子节点的路径都包含相同数量的黑色节点。红黑树插入/删除分为两步:第一步,像二叉排序树的插入/删除一样进行查找、插入/删除;第二步,通过重新着色和旋转调整结构使整个树满足红黑树的状态插入节点为了使插入...
摘要由CSDN通过智能技术生成

红黑树的5个特性

1、 每个节点要么是红色,要么是黑色;
2、 根节点为黑色;
3、 所有叶节点(NIL节点)都是黑色;
4、 每个红色节点的子节点一定是黑色;
5、 从任一节点到其子树中的每个叶子节点的路径都包含相同数量的黑色节点。
红黑树插入/删除分为两步:第一步,像二叉排序树的插入/删除一样进行查找、插入/删除;第二步,通过重新着色和旋转调整结构使整个树满足红黑树的状态

插入节点

为了使插入新节点之后的红黑树尽可能多地满足其5个特性,所以新插入的节点都为红色。这样在插入之后,我们只需要关心插入节点的父节点是否为红色
由于父节点为黑色时并没有破坏红黑树的特性,所以只需考虑父节点为红色的调整情况。由于父节点位于左子树或者右子树的操作是对称的,这里只介绍父节点在左子树的情况。

情况1:父节点与叔叔节点都为红色

假设新插入节点为N,X表示目前需要调整颜色的节点。将X的父节点与叔叔节点置为黑色,同时将其祖父节点G置为红色。这样一来,G又可能破坏红黑树状态,所以X更新为祖父节点,并进行下一次迭代调整

情况2:父节点为红色,叔叔节点为黑色

如果新插入节点为右子节点,则需要先将父节点左旋。改变父节点和祖父节点的颜色,并将祖父节点右旋即可重新恢复红黑树状态。
在这里插入图片描述

TreeMap插入节点后调整的源码

    private void fixAfterInsertion(Entry<K,V> x) {
   
        x.color = RED;//新插入节点颜色为红色

        while (x != null && x != root && x.parent.color == RED) {
   
            if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
   //插入节点的父节点为祖父节点的左孩子
                Entry<K,V> y = rightOf(parentOf(parentOf(x)));//插入节点的叔叔父节点
                if (colorOf(y) == RED) {
   //情况1
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {
   //情况2
                    if (x == rightOf(parentOf(x))) <
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值