平衡AVL树

时间:2017-07-11 02:35:59

标签: algorithm data-structures tree avl-tree tree-balancing

我遇到了平衡-AVL树问题,因为我的解决方案似乎与教科书后面的解决方案相冲突。我看过AVL树的在线可视化,他们认为我的是正确的。我的课本错了吗?

这是树: enter image description here

然后我必须在此AVL树中插入65。这导致了不平衡,根据我的理解,需要左右旋转。

以下是我提出的问题,并通过http://robinsswei.github.io/VisGraphs/avltree.html确认: enter image description here

以下是我的教科书所说的正确答案:

enter image description here

哪一个是正确答案?

3 个答案:

答案 0 :(得分:1)

AVL Tree Diagram

嘿那里, 我实际上认为两种解决方案都是正确的。我认为只有几个原因可能会导致您的图书与众不同。插入节点后,您会发现2个不同的节点的平衡因子为2。那是节点34和45.该算法如何工作是在插入之后,它遵循返回根节点的路径检查平衡因子以及更新它们的节点高度。我认为因为根最后被访问并标记为旋转是为什么它这样做。另一个潜在的原因是,对于根节点,旋转只需要一个简单的旋转,而你所做的旋转需要一个双旋转。无论我觉得两个答案都足够了。

我会尝试为那些可能不知道AVL树是什么的人解释这个问题。我试图标注这个例子。您要做的第一件事是在插入新节点之前确保您的起始AVL树符合要求。我只是标记每个节点的高度,然后获得每个父节点的子节点的高度差。

AVL树要求每个节点的左右儿童的高度最多相差+1或-1。 (-1,0,1)

例如在第一张图中,在插入之前,Id从下到上开始。节点87没有任何子节点,这将是0.节点45只有一个孩子,所以我们计算87的0高度。节点3没有子节点,所以这也是0。节点34有两个子节点,3和45.它们的区别仅为1.所有节点都通过了AVL树测试。

接下来只需通过遍历它来插入节点,就像二进制搜索树一样。

插入后重新标记节点的高度,并再次为每个节点进行比较。这次我们看到节点34(我们的根节点)在子节点之间有“2”的差异(2-0)。我们现在知道节点34需要旋转 执行了简单的左旋转和AVL属性。

答案 1 :(得分:0)

第二个45根是正确的答案。平衡的AVL树必须具有相同的子长度(深度)。所以进入65后,你的树将失去平衡。所以你需要将节点移到左边。

答案 2 :(得分:0)

我认为应该是左右旋转,而不是左右旋转,所以教科书是正确的。