我遇到了平衡-AVL树问题,因为我的解决方案似乎与教科书后面的解决方案相冲突。我看过AVL树的在线可视化,他们认为我的是正确的。我的课本错了吗?
然后我必须在此AVL树中插入65。这导致了不平衡,根据我的理解,需要左右旋转。
以下是我提出的问题,并通过http://robinsswei.github.io/VisGraphs/avltree.html确认:
以下是我的教科书所说的正确答案:
哪一个是正确答案?
答案 0 :(得分:1)
我会尝试为那些可能不知道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)
我认为应该是左右旋转,而不是左右旋转,所以教科书是正确的。