写的太棒了,注意的两点,一个是旋转调整,一个节点删除
旋转调整:原文中描述的很清楚了
四种失衡调整
类型 | 使用情形 |
单左旋 | 在左子树插入左孩子节点,使得平衡因子绝对值由1增至2 |
单右旋 | 在右子树插入右孩子节点,使得平衡因子绝对值由1增至2 |
先左旋后右旋 | 在左子树插入右孩子节点,使得平衡因子绝对值由1增至2 |
先右旋后左旋 | 在右子树插入左孩子节点,使得平衡因子绝对值由1增至2 |
删除补充一下:
三种情况:
[1]. 叶子节点:直接删除,然后旋转调整;
[2]. 只有左(右)子树,删除然后用左(右)子树的根节点代替之,最后旋转调整;
[3]. 左右子树都存在
a) 中序遍历该要被删除的节点,该节点的前驱结点q代替它,旋转调整;说白了就是在左子树中找最大的那个值来代替之。
b) 中序遍历后用后续节点h代替,和上面的其实一样,就是找一个最接近的数来代替(无非中序遍历的前后俩)
c) 中序遍历后,删除,用左子树代替,右子树接到q的右子树上
其中a)实现起来最简单,只需要在左子树上一直往右遍历就好了