右旋结果:将该节点变成其左孩子的右孩子
右旋源码如下:
/** From CLR */
private void rotateRight(Entry<K,V> p) {
//右旋前提,p和l都存在
if (p != null) {
Entry<K,V> l = p.left;
---------------------------------------------------------------------------------------------------------------------------
// ①: p的左孩子指向l的右孩子
p.left = l.right;
//如果l的右孩子存在,将l的右孩子的parent指向p,l的parent指向p的parent
if (l.right != null), l.right.parent = p;
----------------------------------------------------------------------------------------------------------------------------
//②:l的parent指向p的parent
l.parent = p.parent;
//如果p的parent为空,l变成root节点
if (p.parent == null)
root = l;
//p的parent不为空,先判断p如果是p的parent得到右孩子,将p的parent的右孩子指向l
else if (p.parent.right == p)
p.parent.right = l;
//p如果是p的parent得到左孩子,将p的parent的左孩子指向l
else p.parent.left = l;
//l的右孩子指向p
---------------------------------------------------------------------------------------------------------------------------
//③:将p变成l的右孩子
l.right = p;
//p的parent指向l
p.parent = l;
//至此p变成了它左孩子l的右孩子完成右旋
}
}
过程步骤分析:
① p.l–>l.r
若l.r存在 l.r.p–>p
②l.p–>p.p
若p.p不存在,l–>root
若p.p存在且p.p.r=p,p.p.r–>l
若p.p存在且p.p.l=p,p.p.l–>l
③将p变成l的右孩子
l.r–>p
p.p–>l
下图是p.p存在且p为p.p的左孩子,且l.r存在的情况