我在平衡avl树问题上遇到了麻烦,因为我的解决方案似乎与课本后面的解决方案冲突。我看过AVL树的在线可视化,他们认为我的是正确的我的课本错了吗?
这是树:
algorithm - 平衡AVL树-LMLPHP
然后我必须将65插入到这个AVL树中这会导致不平衡,据我所知,需要左右旋转。
以下是我的想法,并已通过http://robinsswei.github.io/VisGraphs/avltree.html确认:
algorithm - 平衡AVL树-LMLPHP
以下是我的教科书中的正确答案:
algorithm - 平衡AVL树-LMLPHP
哪一个是正确的答案?

最佳答案

algorithm - 平衡AVL树-LMLPHP
嘿,在那儿,
我认为这两种方法都是正确的我认为你的书之所以与众不同有几个原因插入节点后,您将发现两个不同的节点的平衡因子为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-0)之间有一个“2”的差异。现在我们知道节点34需要旋转。
执行了一个简单的左旋转并满足了avl属性。

关于algorithm - 平衡AVL树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45024443/

10-11 03:35