红黑树理解右旋
Posted zhangjin1120
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红黑树理解右旋相关的知识,希望对你有一定的参考价值。
红黑树理解 (一) 从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;
}
...
}
...
}
以上是关于红黑树理解右旋的主要内容,如果未能解决你的问题,请参考以下文章