红黑树理解(五)右旋

红黑树理解 (一) 从2-3树到红黑树
红黑树理解(二)插入过程图解
红黑树理解(三)变色
红黑树理解(四)左旋
红黑树理解(五)右旋

右旋的目的是什么?

将以旋转节点为根的红黑树的根节点左移,配合其他操作使红黑树恢复平衡。

右旋的条件是什么?

  • 左子节点不为空。
  • 旋转节点的左路,存在两个相连的红色节点。

右旋的具体步骤是什么?

以某个结点作为旋转结点,其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。 出自:30张图带你彻底理解红黑树。也就是

  • 左子节点变为旋转节点的父节点。
  • 左子节点的右子节点变为旋转节点的右子节点。

右旋举例

(一)选转节点为插入节点的爷爷节点在这里插入图片描述
再列举个稍微不同的情况,旋转节点不是根节点:下图中插入的节点是1,旋转节点是5,5不是根节点。
在这里插入图片描述
(二)旋转节点是插入节点的父节点
下图中,插入节点是7,旋转节点是8,旋转节点是插入节点的父节点。

右旋的Java代码实现

jdk1.8 HashMap.java,代码分析后面介绍。

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
    
    
    static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
    
    
       	...
        static <K,V> TreeNode<K,V> rotateRight(TreeNode<K,V> root,
                                               TreeNode<K,V> p) {
    
    
            TreeNode<K,V> l, pp, lr;
            if (p != null && (l = p.left) != null) {
    
    
                if ((lr = p.left = l.right) != null)
                    lr.parent = p;
                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;
        }
    	...
    }
    ...
}

猜你喜欢

转载自blog.csdn.net/zhangjin1120/article/details/121246890
今日推荐