当前位置: 首页 >> 新闻世界 >> 阿普唑仑片,带你走进Java调集-HashMap源码-红黑树的那点事,cps >> 正文

阿普唑仑片,带你走进Java调集-HashMap源码-红黑树的那点事,cps

2019年04月11日 00:30:28     作者:admin     分类:新闻世界     阅读次数:259    

由于作业忙的原因,有一段时间没有写文章了,来持续咱们的Java源码之旅。上几篇文章咱们首要介绍了HashMap的一些根底内容,也介绍了HashMap的底层数据结构:数组+阿普唑仑片,带你走进Java集结-HashMap源码-红黑树的那点事,cps链表+红黑树,数组、链表这两个数据结构十分的简略,咱们就不侧重介绍了,今日咱们开端说一下红黑树。

红黑树的5个特性有必要牢牢地记住:

特性1:每个节点要么是黑色的,要么是赤色的,没有第三种色彩

特性2:根节点一定是黑色的

特性3:一切的叶子节点(在Java泰隆银行企业邮箱中为null)一定是黑色的

特性4:不能有两个接连的赤色节点(就是说两个赤色节点不能挨着)

特性5:从恣意节点到叶子节点包括相厉爵风同的黑色节点数

接下来根据这5个特性,剖析一下红黑树呈现的悉数情形。咱们界说如下:

x:新刺进的节点

xp:新刺进节点x的父节点

xpp:新刺进节点x合丰混的的祖父节点

u:新刺进节点x的叔叔节点

着重:新刺进的节点x默以为赤色,即x.r丈母娘来ed=true

在HashMap中红黑树的数据结构界说如下:

publ仅有的迷蝶ic class TreeNode {
/**
* 节点的父节点
*/
private TreeNode parent;
/**
* 节点的左子树
*/
private TreeNode left;
/**
* 节点的右子树
*/
private TreeNode right;
/**
* 节点的色彩
*/
boolean red;
}

情形1:刺进的节点x为根节点,xp==null(此刻为空树)

带你走进Java集结-HashMap源码-红黑树的那点事

此情形违背了红黑树的特性2,根节点一定为黑节点。

修正办法如下:

节点x为根节点,只需将节点x的色彩从赤色变成黑色即可。x.red=false
带你走进Java集结-HashMap源码-红黑树的那点事

HashMap源码对此情形的修正如下:

if ((xp = x.par阿普唑仑片,带你走进Java集结-HashMap源码-红黑树的那点事,cpsent) == null) {
x.red = false;
return x;
}

情形2:父节点xp存在,而且xp的色彩为黑色(xp.red=false)琦琪手机

此情形并没有违背红黑树的任何特性,所以不需要修正,

HasmoneytalkshMap的源码如下:

else if (!xp.red || (xpp = xp.parent) == n阿普唑仑片,带你走进Java集结-HashMap源码-红黑树的那点事,cpsull)
return root;

上述代码有2个判别,只需有一个为真,都契合这个场景。

第一个判别:!xp.red,标明父节点xp为黑色

第二个判别:(xpp=xp.parent)==null,标明父节点xp是根节点

情形3:父节点xp和叔叔节点u都存在,且都为赤色

这种情形如图所示:

刺进节点x后音波萝莉,此刻的红黑树违背了特性4,不能有栗山龙两个接连的赤色节点。

修正办法如下:

第一步:将父节点xp和叔叔节点u的色彩都变成黑色:xp.red=false,u.red=fals阿普唑仑片,带你走进Java集结-HashMap源码-红黑树的那点事,cpse
第二步:将祖父节点xpp的色彩变成赤色:xpp.阿普唑仑片,带你走进Java集结-HashMap源码-红黑树的那点事,cpsred=true
第三步:以祖父节点xpp为方针节点,递归持续判别,乌兰巴托不眠夜直到整棵树都契合5个特性:x=xpp

修正后的图示百变魔音如下:

HashMap对此情形的修正如下:

//父节点xp为x的左子树
if (xp == (xppl = xpp.left)) {
if ((xppr = xpp.right) != null && xppr.red) {
xppr.red = false;
xp.red = false;
xpp.red = true;
x = xpp;
}
//父节点xp为x的右子树
if (xppl != null && xppl.red) {
xppl.red = false;
xp.red = false;
xpp.red = true;
x = xpp;
}

情形3的图示只展现了x为xp左节点的状况,假如为右节点,修正规矩相同。

情形4:父节点xp为赤色节点,叔叔节点u不存在或许mird075叔叔节点u为黑色节点

这种情形如图所示:

刺进节点x后,违背了红黑树的特性4,不能有两个相邻的赤色节点,假如依照情形3的修正办法,把xp的色彩改成黑色,上图分支上少了一个黑色节点,这又违背了特性5,从恣意一芙蓉镇读后感个节点到叶子节点,都有相同的黑色节点,所以不能依照情形三去修正。咱们能够经过旋转的办法憨豆先生的黄金周去修正。

修正办法如下:(阿普唑仑片,带你走进Java集结-HashMap源码-红黑树的那点事,cps变色----右旋

第一步:将父节点的色彩变成黑色,即xp.red=false,将祖父节点xpp变成赤色,xpp.red=true
第二步:以祖父节点xpp为轴中心,父节点xp顺时针旋转(右旋)

假如在刺进后王希克是这种图示的话,该怎样修正呢?

修正如下:(左旋---变色---右旋

第一步:以x为轴中心,父节点xp逆时针旋转
第二步:将父节点的色彩变成黑色,即xp.red=false,将祖父节点xpp变成赤色,xpp.red=true
第三步:以祖父节点xpp为轴中心,父节点xp顺时针旋转(右旋)

总结一点:先左旋,后右旋

HashMap的源码如下:

右旋
static TreeNode rotateRight(TreeNode root,
TreeNode p) {
TreeNode l, pp, lr;
if (p != null && (l = p.left) != null) {
if ((lr = p.left = l.right) != null)
lr.parent = p阿普唑仑片,带你走进Java集结-HashMap源码-红黑树的那点事,cps;
if ((pp = l.parent = p.parent) == null)
(root = l).red = false;
else if (pp.right == p)
pp.right = l;
else
pp.left = l;
l.right = p;
p.parent = 绿色循环圈战神塔攻略l;
}
return root;
}

左旋:
static TrgayvieeNode rotateLeft(TreeNode root,
TreeNode p) {
TreeNode r, pp, rl;
if (p != null && (r = p.right) != null) {
if ((rl = p.right = r.left) != null)
rl.parent = p;
if ((pp = r.parent = p.p舔丝足arent) == null)
(root = r).red = false;
else if (pp.left == p)
pp.left = r;
else
pp.right = r;
r.left = p;
p.parent = r;
}
return root;
}

接下来的一篇掼蛋团团转文章,将用一个实例去阐明

除非特别注明,本文『阿普唑仑片,带你走进Java调集-HashMap源码-红黑树的那点事,cps』来源于互联网、微信平台、QQ空间以及其它朋友推荐等,非本站作者原创。 本站作者admin不对本文拥有版权,如有侵犯,请投诉。我们会在72小时内删除。 但烦请转载时请标明出处:“本文转载于『2012新起点-从2012开始的一切新鲜事』,原文地址:http://www.xyz2012.com/articles/1541.html