红黑树节点的删除同样会使红黑树失衡。调整的方法大概和添加节点相反。比如,变红与变黑互换;左旋与右旋互换。
算法逻辑:
(1)如果被删除的节点是“叶节点”(左右都是空黑节点)直接删除。
(2)如果只有一侧不为空黑节点,用这侧节点代替被删节点。
(3)如果两侧都不是空黑节点,用右侧最小节点值替代被删节点,被删节点保留,删除右侧最小节点。
(4)如果实际删除的节点原来颜色是黑色,需要进行平衡调整:
(4.1)如果删除的节点没有父节点,说明删除了唯一的根节点,整树已空,完成。
(4.2)当前节点(节点删除后,在那个位置的节点)是红色,改黑色,完成。
(4.3)兄弟节点是红色,改黑色,旋转,完成。
(4.4.1)父节点为红色,旋转,完成。
(4.4.2)父节点为黑色,改红色后旋转,用爷节点作为父节点递归调用,完成。
程序代码:
运行结果:
练习题1:改变上例中的测试数据,进行测试。
学思营编程课堂基于蓝桥STEM86平台https://www.stem86.com,开展学编程三部曲:
Scratch(三年级以前)>>>Python(四年级以后)>>>C++(七年级以后)教育实验活动,任何人可以免费参加,打开https://xuesiying.stem86.com网页注册进入课堂,也可关注本公众号留言。
更多课程请打开“学思营”同步网站:
http://www.5xstar.com/doc.html
参考资料:
1、《Python算法图解》何韬编著 清华大学出版社