集合(二)HashMap源码解析,前置章节(2-3树和红黑树)

一、2-3树

1.1 2-3树的特征

       1. 每个节点都可以存放一个元素或者两个元素

        2.存放一个元素的节点称为2-节点、存放两个元素的节点叫做3-节点

        3.每个节点有2个或者3个子节点的树称为2-3树,2-3树满足二叉搜索树的基本性质

        4.2-3树是一个绝对平衡的树(叶子节点高度差为0)

1.2 2-3节点添加

二、2-3树和红黑树等价性 

2.1 2-3树等价转换红黑树

下面图1的2-3树等价于图2的红黑树

                                 图1                                                                    图2

三、左倾红黑树的定义

        1.红黑树的每个节点或是红色或者是黑色

        2.根节点是黑色的,红色节点向左倾斜

        3.每个叶子节点都是黑色的

        4.如果一个节点是红色的,那么他的孩子节点都是黑色的

        5.从任何一个节点到叶子节点,经过的黑色节点是一样的

3.1 红黑树节点的添加

        根据2-3树的添加过程,可以看出与其等价的红黑树每个添加的节点都是红色

3.1.1 左旋

  

3.1.2 颜色翻转

3.1.3 右旋

3.1.4 添加节点汇总

四、TreeMap中红黑树源码

private void fixAfterInsertion(Entry<K,V> x) {
        x.color = RED;

        while (x != null && x != root && x.parent.color == RED) {
            //x的爷爷节点的左孩子是x的父级节点,x的父级节点是红色
            if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
                Entry<K,V> y = rightOf(parentOf(parentOf(x)));//x的父级节点的兄弟节点
                if (colorOf(y) == RED) {//而且x的父级节点的兄弟节点也是红色
                    //颜色翻转
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {
                    if (x == rightOf(parentOf(x))) {//x是父级节点的右孩子
                        //左旋操作
                        x = parentOf(x);
                        rotateLeft(x);
                    }
                    setColor(parentOf(x), BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    //右旋操作
                    rotateRight(parentOf(parentOf(x)));
                }
            } else {
                Entry<K,V> y = leftOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {
                    if (x == leftOf(parentOf(x))) {
                        x = parentOf(x);
                        rotateRight(x);
                    }
                    setColor(parentOf(x), BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    rotateLeft(parentOf(parentOf(x)));
                }
            }
        }
        root.color = BLACK;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值