对于AVL树,当从树中删除需要重组的节点时,我正在阅读的书中指出,有一些规则要遵循以选择要重组的节点。一个例子就是这样:
44
/ \
17 62
/ \
50 78
/ \ \
48 54 88
这是删除节点(节点17的子节点)并且违反了height-balance属性之后的AVL树。
我读过的书指出,它将让z成为从节点17上升的第一个不平衡位置,y是具有更高高度的z的子节点,最后x是具有更高高度的y的子节点。但是,如果y的子节点具有相同的高度,则x将与y相同。在这种情况下,x是78,y是62,z是44.
现在提出问题了。为什么我们选择x使它与y同侧?如果我选择x与y不同,那么AVL树会出现任何问题吗?我试图给自己举例,并尝试选择两种类型的x,并重构AVL树。但是,我似乎无法找到将x选为任何一个孩子所引起的任何问题。感谢任何帮助,以帮助我解决这个问题。
答案 0 :(得分:0)
有趣的是,该主题在各种Web论坛中都有很多不同的答案。我尝试创建所有可能的AVL树节点删除方案,并且观察到,如果从AVL树的左侧删除该节点以使树不平衡,请根据节点可用性执行LL或LR(任何可能的旋转),并且树会均衡。 反之亦然,删除右节点。
此外,还需要确定由于旋转而移动的节点是否具有子节点,如果分别在旋转之前位于左侧或右侧,则分别在左侧或右侧插入子节点。