重新平衡AVL树

时间:2011-02-02 22:29:23

标签: avl-tree

我有以下AVL树:

                               10
                             /    \
                            5     12
                           / \   /  \
                          2  8   11  13
                        /  \ /\   
                        1  4 7 9

如果我插入3,那么我得到:

                               10
                             /    \
                            5     12
                           / \   /  \
                          2  8   11  13
                        /  \ /\   
                        1  4 7 9
                          /
                         3

如果我计算每个节点的平衡因子,似乎每个BF都有效: (节点:BF) - > 10:1,5:0,2:-1,1:0,4:-1,8:0,7:0,9:0,3:0,12:0,11:0,13:0 但显然这棵树需要重新平衡。哪里有无效的BF,那么如何进行必要的旋转。

1 个答案:

答案 0 :(得分:1)

10应该有一个平衡因子2,它的左子树5-2-4-3和右子树12-13。单次旋转后的有效树可能看起来像5 | 2 10 | 1 4 8 12 | nil nil 3 nil 7 9 11 13。

重新平衡的一种可能方法是cut-link-algorithm: 1.命名不平衡节点z,其中一个是孩子的y,另一个是孩子的孩子x。 2.在inorder-traversal中将节点重命名为a,b,c,并让它们的子节点从左到右为T0,T1,T2和T3。 3.将b设置为新的根,将a设置为其左子,将c设置为其右子。 4.将从左到右对应的四个子树附加为T0,T1,T2和T3。