如何平衡此树结构
13
/ \
8 18
/ \
14 19
\
15
答案 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文章实际上也有一些不错的插图: