平衡树

时间:2009-12-30 09:17:21

标签: avl-tree

如何平衡此树结构

                                 13
                                /  \
                               8    18
                                   /  \
                                 14    19
                                   \
                                    15

4 个答案:

答案 0 :(得分:4)

您没有指定所需的平衡树。例如,您可以使用AVL树

如果你计算节点高,那么你将得到节点13失衡,值为-2和18与1,所以你必须在节点18中进行正确的旋转并在节点13中进行左旋转。之后节点变得平衡。

右旋后:

                             13
                            /  \
                           8    14
                                  \
                                   18
                                  /  \
                                15    19

左转后:

                             14
                            /  \
                           13   18
                          /    /  \
                         8    15   19

答案 1 :(得分:1)

您的值为8 13 14 15 18 19,因此具有这些值的平衡树可以是:

       15
    /      \
  13        19
 /  \      /
8    14  18

为了获得这棵树,我计算了这些值以获得树的一般形状(从左到右,从上到下填充图层)然后对值进行排序并将它们从左到右放置在树中。

如果平衡一次树,这具有良好的性能,但在每次插入/删除后不应用于平衡树。

答案 2 :(得分:0)

我也是学生并研究avl树,在这个问题中,节点13的余额是-2,这违反了avl条件,现在由于插入了新节点15而发生这种违规。现在节点是违反avl条件让我们称之为alpha,现在我们需要确定插入的情况 插入的案例是: 1)插入alpha的右子树的右子树(alpha是其平衡因子违反avl条件的节点)。在这种情况下,我们需要单左旋转。 2)插入alpha右子的左子树。在这种情况下,我们需要做左旋转的双旋转。 3)插入alpha左子的右子树。在这种情况下,我们需要进行左旋转的双旋转。 4)插入alpha左子的左子树。在这种情况下,我们需要进行单右旋转以重新平衡树。

现在在您的问题中这是案例2,我们需要左右旋转来重新平衡树。 我们将在alpha的右子和其左子树的父级之间进行正确的旋转。 然后在这之后我们需要在alpha和alpha的新右子之间进行左旋转(这是alpha右子的左子树的父级)在这个左旋转之后我们有一个树,谁的根是14的左子14是13岁的13岁左右孩子.14岁的右孩是18岁的18岁左右的孩子,18岁的15岁是19岁。 我不知道如何发布这棵树的信息,Gaim也回答了这个问题。所以看看他发布的信息。 我希望这会有所帮助。

答案 3 :(得分:0)

实际上,AVL树在插入时是平衡的,检查节点是否需要平衡,并使用 tail-recursion 来平衡从插入返回的路上的所有内容。维基百科的AVL文章实际上也有一些不错的插图:

http://en.wikipedia.org/wiki/AVL_tree#Insertion