为什么只有当插入节点的叔叔是黑色时,红黑树才会旋转?有人可以解释其属性背后的逻辑吗?
Why a Red Black Tree only rotated when the uncle of the inserted node is black? can someone explain the logic behind it's properties?
所以最近我一直在分析红黑树和它的属性,并试图解释为什么它们是这样的,我明白这些约束是用来保持树的平衡和高效的,同时保持它的高度,但是我仍然无法找到一种方法来清楚地理解为什么我们只在新插入节点的叔叔为黑色时才旋转树?为什么我们只在它的叔叔是红色的时候才给它重新着色?我试图理解所有这些属性背后的逻辑,谁能解释一下?非常感谢任何帮助!
当叔叔是黑色时,插入过程中至少需要旋转一次,因为在这种情况下有一个red-violation(连续两个红色节点)但是树不平衡没有数量re-coloring 会修复它。
最简单的情况
1b
\
2r
\
3r
1 和 2 各有一个叶节点(未显示),而 3 有两个叶节点(也未显示)。暂时忽略节点颜色,很容易看出为了使这棵树平衡需要旋转,伴随旋转的重新着色用于修复 red-black 属性。当第二个红色节点不对齐时(右 child 左 child 或左 child 右 child)需要第二次旋转,因为这样的节点在逻辑上是 'in between' 它的 parent 和 grandparent.
有树:
2b
/ \
1r 3r
\
4r
红色节点 属性 被推到树上,因为这里再多的旋转都无法修复树,树结构中的任何不平衡都必须高于此处显示的级别。
所以最近我一直在分析红黑树和它的属性,并试图解释为什么它们是这样的,我明白这些约束是用来保持树的平衡和高效的,同时保持它的高度,但是我仍然无法找到一种方法来清楚地理解为什么我们只在新插入节点的叔叔为黑色时才旋转树?为什么我们只在它的叔叔是红色的时候才给它重新着色?我试图理解所有这些属性背后的逻辑,谁能解释一下?非常感谢任何帮助!
当叔叔是黑色时,插入过程中至少需要旋转一次,因为在这种情况下有一个red-violation(连续两个红色节点)但是树不平衡没有数量re-coloring 会修复它。
最简单的情况
1b
\
2r
\
3r
1 和 2 各有一个叶节点(未显示),而 3 有两个叶节点(也未显示)。暂时忽略节点颜色,很容易看出为了使这棵树平衡需要旋转,伴随旋转的重新着色用于修复 red-black 属性。当第二个红色节点不对齐时(右 child 左 child 或左 child 右 child)需要第二次旋转,因为这样的节点在逻辑上是 'in between' 它的 parent 和 grandparent.
有树:
2b
/ \
1r 3r
\
4r
红色节点 属性 被推到树上,因为这里再多的旋转都无法修复树,树结构中的任何不平衡都必须高于此处显示的级别。