加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

3分钟让你大白:HashMap之红黑树树化进程

发布时间:2019-10-13 08:58:37 所属栏目:建站 来源:追逐仰望星空
导读:01 概述 HashMap是Java措施员行使频率最高的用于映射(键值对)处理赏罚的数据范例。跟着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现举办了优化,譬喻引入红黑树的数据布局和扩容的优化等。本文首要说明一下HashMap中红黑树树化的进程。 02

x自己为根节点返回x。 x的父节点为玄色可能x的父节点是根节点直接返回不必要调动。 如若上述两个前提不满意的话,就要举办调动了,应承我再贴一点代码......没有代码说明起来很坚苦。

06 颜色调动

  1. if (xp == (xppl = xpp.left)) 
  2.  { 
  3.  if ((xppr = xpp.right) != null && xppr.red) 
  4.  { 
  5.  xppr.red = false; 
  6.  xp.red = false; 
  7.  xpp.red = true; 
  8.  x = xpp; 
  9.  } 

这里是一个典范的一个玄色节点的两个子节点都是赤色的以是要举办颜色调动,由于插入的都是赤色节点,当检测到祖父节点的阁下子节点都是赤色的时辰两个赤色就发生了斗嘴,以是先将节点举办这种颜色调动,将祖父节点酿成赤色,然后将祖父的两个子节点酿成玄色,这样我们插入的赤色节点就不会违反红黑树的法则了。

3分钟让你大白:HashMap之红黑树树化进程

这里有人会有疑问,假如祖父节点是根节点呢,那样的话祖父节点也会酿成玄色,由于每次轮回举办插入均衡的操纵当举办这种颜色调动之后城市将插入节点的引用指向祖父节点,当举办下一轮轮回的时辰会优先检测当前节点是否是根节点,假如是根节点那就将颜色酿成玄色,下面看图:

当将节点指向祖父节点举办下一轮轮回时:

3分钟让你大白:HashMap之红黑树树化进程

07 两个焦点旋转(左旋转和右旋转)

  1. // 一旦我们进入到这里就声名白两件是情 
  2.  // 1.x的父节点xp是赤色的,这样就碰着两个赤色节点相连的题目,以是必需颠末旋转调动。 
  3.  // 2.x的祖父节点xpp不为空。 
  4.   
  5.  // 判定假如父节点是否是祖父节点的左节点 
  6.  if (xp == (xppl = xpp.left)) 
  7.  { 
  8.  if ((xppr = xpp.right) != null && xppr.red) 
  9.  {// ...... 
  10.  } 
  11.  // 进入到这个else内里声名。 
  12.  // 父节点xp是祖父的左节点xppr。 
  13.  // 祖父节点xpp的右节点xppr是玄色节点可能为空,默认划定空节点也是玄色的。 
  14.  // 下面要判定x是xp的左节点照旧右节点。 
  15.  else 
  16.  { 
  17.  // x是xp的右节点,此时的布局是:xpp左->xp右->x。这明明是第二中调动必要举办两次旋转,这里先举办一次旋转。 
  18.  // 下面是第一次旋转。 
  19.  if (x == xp.right) 
  20.  { 
  21.  root = rotateLeft(root, x = xp); 
  22.  xpp = (xp = x.parent) == null ? null : xp.parent; 
  23.  } 
  24.  // 针对自己就是xpp左->xp左->x的布局可能因为上面的旋转造成的这种布局举办一次旋转。 
  25.  if (xp != null) 
  26.  { 
  27.  xp.red = false; 
  28.  if (xpp != null) 
  29.  { 
  30.  xpp.red = true; 
  31.  root = rotateRight(root, xpp); 
  32.  } 
  33.  } 
  34.  } 
  35.  }  

颜色调动完成后进入下面的else块

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读