红黑树维持平衡问题
来源:13-7 红黑树中添加新元素
丶远走高飞
2018-07-12
老师在讲 在红黑树中添加一个元素时, 用了3个if 来进行平衡的维持
并且说 这3个if 不是互斥的、
我仔细想了想,我始终觉得在左倾红黑树下,当第一个if满足时,即首先左旋转,后面的两个if条件是不会满足的。在当前node下。
所以,特来请教老师。
写回答
3回答
-
课程在这一小节前面部分讲解的PPT,就是举了三个最基础的例子,分别说明了什么时候只需要flipColor(只走最后一个if);什么时候右旋转以后再flipColor(走最后两个if);什么时候需要先左旋转,再右旋转,最后flipColor(走三个if),最终,得到了下面的图示:
左旋转以后需要右旋转再flipColor,请再回顾课程中的这个例子(对应视频2:08至4:52):)
当然,也可以自己动手实验。在我们这一小节的代码上,运行这个测试:(就是上面PPT中描述的情况)
public static void main(String[] args){ RBTree<Integer, Integer> map = new RBTree<>(); map.add(42, null); map.add(37, null); map.add(40, null); // 在插入这个40的时候,三个if都会走 }
为了看到三个if的运行情况,可以在三个if中做相应的打印输出:
if (isRed(node.right) && !isRed(node.left)){ System.out.println("Add " + key + ", leftRotate"); node = leftRotate(node); } if (isRed(node.left) && isRed(node.left.left)){ System.out.println("Add " + key + ", rightRotate"); node = rightRotate(node); } if (isRed(node.left) && isRed(node.right)){ System.out.println("Add " + key + ", flipColors"); flipColors(node); }
测试一下,看看是不是会输出这样的结果?
Add 40, leftRotate Add 40, rightRotate Add 40, flipColors
在插入40的时候,三个if全都执行了:)
加油!
0132019-10-20 -
丶远走高飞
提问者
2018-07-13
这样看会不会更清晰。 我把第一个if和后两个if做成互斥条件
答案一样。
00 -
丶远走高飞
提问者
2018-07-13
我测试了。。并没有在同一个函数调用
老师看图
012018-07-13
相似问题