设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 创业者
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

3分钟让你明白:HashMap之红黑树树化过程(5)

发布时间:2019-10-12 13:35 所属栏目:21 来源:追逐仰望星空
导读:x本身为根节点返回x。 x的父节点为黑色或者x的父节点是根节点直接返回不需要变换。 如若上述两个条件不满足的话,就要进行变换了,允许我再贴一点代码......没有代码分析起来很困难。 06 颜色变换 if(xp==(xppl=xpp

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块

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读