【发布时间】:2014-01-21 15:25:59
【问题描述】:
我的最佳猜测是,当您从已经平衡的 AVL 树中插入或删除一个元素时,一次旋转总是足以平衡 AVL 树。
转一圈就够了吗? 在需要多次旋转的情况下,一个示例会有所帮助。
PS:我将 RL/LR 旋转算作一次旋转。
【问题讨论】:
标签: data-structures tree rotation binary-tree avl-tree
我的最佳猜测是,当您从已经平衡的 AVL 树中插入或删除一个元素时,一次旋转总是足以平衡 AVL 树。
转一圈就够了吗? 在需要多次旋转的情况下,一个示例会有所帮助。
PS:我将 RL/LR 旋转算作一次旋转。
【问题讨论】:
标签: data-structures tree rotation binary-tree avl-tree
对于插入,最多旋转 1 次。
对于删除,旋转次数以 O(log(n)) 为界。 Log(n) 是树的高度。
关于 AVL 删除的更多解释。
当你从 AVL 中删除一个节点时,你可能会导致树不平衡,你必须追溯到它不平衡的点。如果不平衡点是根。您必须从上到下重新平衡树。
【讨论】:
对于插入,我相信一个就足够了。
但要删除: 考虑这棵树:
50
/ \
25 75
/ \ / \
15 40 60 80
/ / \ \
35 55 65 90
/
62
删除15,先破坏25的平衡因子,一转:
50
/ \
35 75
/ \ / \
25 40 60 80
/ \ \
55 65 90
/
62
但是,我们还是要检查一下,现在树的根的平衡因子被破坏了,必须再次旋转:
60
/ \
50 75
/ \ / \
35 55 65 80
/ \ / \
25 40 62 90
【讨论】: