jdk1.8 hashmap.balanceInsertion方法源码

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。[这里指到叶子节点的路径]

static <K,V> TreeNode<K,V> balanceInsertion(TreeNode<K,V> root,
                                                    TreeNode<K,V> x) {
            x.red = true;//当新添加一个节点到树中后,将其颜色置为red
            //开始循环,xp为x的父亲,xpp为x的爷爷,
    		//xppl为x的爷爷的左孩子,xppr为x的爷爷的右孩子
            for (TreeNode<K,V> xp, xpp, xppl, xppr;;) {
                if ((xp = x.parent) == null) {//1、  当插入的节点的父节点为null,则将该节点颜色置为black。
                    x.red = false;
                    return x;
                }
                else if (!xp.red || (xpp = xp.parent) == null)//2、  当插入节点的父节点颜色为black或者x的爷爷为空,不需要调整。
                    return root;
                //走到这里说明父节点为红色
                if (xp == (xppl = xpp.left)) {//x的父节点为x爷爷的左孩子
                	//3、当爷爷的右节点不为空并且是红色,也就是说爷爷下面的两个子节点都为红,直接把
					//父节点和叔父节点置为black,同时将祖父节点置为red,将爷爷节点设置为当前新增节点,循环继续调整。
                    if ((xppr = xpp.right) != null && xppr.red) {
                        xppr.red = false;
                        xp.red = false;
                        xpp.red = true;
                        x = xpp;
                    }
                    else {//叔父节点为空或者叔父节点为黑色
                        if (x == xp.right) {//插入节点为父节点的右节点同时父亲节点是祖父节点的左孩子,则进行左旋
                        	//此时树结构为xpp==>左xp==>右x
                            root = rotateLeft(root, x = xp); 
                            //此时树结构为xpp==>左r==>左(x和xp)
                            xpp = (xp = x.parent) == null ? null : xp.parent; 
                            //此时树结构为xpp==>左xp(原来的x)==>左x(原来的xp)
                        }
                        if (xp != null) {
                            xp.red = false;//此时树结构为xpp==>左xp(黑)==>左x(红)
                            if (xpp != null) {
                                xpp.red = true;//此时树结构为xpp(红)==>左xp(黑)==>左x(红)
                                root = rotateRight(root, xpp);
                                //xppp==>左xp(黑)==>左x(红)
                                //				  ==>右xpp(红)
                            }
                        }
                    }
                }
                else {//否则父节点为爷爷的右节点
                	//当爷爷的左节点不为空并且是红色,也就是说爷爷下面的两个子节点都为红,直接把
					//父节点和叔父节点置为black,同时将祖父节点置为red,将爷爷节点设置为当前新增节点,循环继续调整。
                    if (xppl != null && xppl.red) {
                        xppl.red = false;
                        xp.red = false;
                        xpp.red = true;
                        x = xpp;
                    }
                    else {//叔父节点为空或者叔父节点为黑色
                        if (x == xp.left) {//插入节点为父节点的左节点同时父亲节点是祖父节点的右孩子,则进行右旋
                        	//此时树结构为xpp==>右xp==>左x
                            root = rotateRight(root, x = xp);
                            //此时树结构为xpp==>右l==>右(x和xp)
                            xpp = (xp = x.parent) == null ? null : xp.parent;
                            //此时树结构为xpp==>右xp(原来的x)==>右x(原来的xp)
                        }
                        if (xp != null) {
                            xp.red = false;//此时树结构为xpp==>右xp(黑)==>右x(红)
                            if (xpp != null) {
                                xpp.red = true;//此时树结构为xpp(红)==>右xp(黑)==>右x(红)
                                root = rotateLeft(root, xpp);
                                //xppp==>右xp(黑)==>右x(红)
                                //				  ==>左xpp(红)
                            }
                        }
                    }
                }
            }
        }

红黑树在线生成链接:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
雪皓梅丹的HashMap分析之红黑树树化过程:https://www.cnblogs.com/finite/p/8251587.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值