0

如何平衡这种树状结构

                                 13
                                /  \
                               8    18
                                   /  \
                                 14    19
                                   \
                                    15
4

4 回答 4

4

你没有指定你想要什么样的平衡树。例如,您可以使用 AVL 树

如果您计算节点高点,那么您将得到节点 13 的不平衡值为 -2 和 18 的值为 1,因此您必须在节点 18 中进行右旋转,在节点 13 中进行左旋转。之后该节点变得平衡。

右旋后:

                             13
                            /  \
                           8    14
                                  \
                                   18
                                  /  \
                                15    19

左旋转后:

                             14
                            /  \
                           13   18
                          /    /  \
                         8    15   19
于 2009-12-30T09:34:01.127 回答
1

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

       15
    /      \
  13        19
 /  \      /
8    14  18

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

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

于 2009-12-30T09:28:34.493 回答
0

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

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

于 2009-12-30T12:41:34.477 回答
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 的左孩子是 8。14 的右孩子是 18 18 的左孩子是 15 18 的右孩子是 19。我不知道如何发布这棵树的数字,Gaim 的人也回答了这个问题。所以看看他贴的图。我希望这将有所帮助。

于 2009-12-30T12:32:17.103 回答