Data structures AVL树删除规则

Data structures AVL树删除规则,data-structures,tree,binary-search-tree,avl-tree,Data Structures,Tree,Binary Search Tree,Avl Tree,对于AVL树,当从需要重构的树中删除节点时,我正在阅读的书指出,要选择要重构的节点,需要遵循某些规则。例如: 44 / \ 17 62 / \ 50 78 / \ \ 48 54 88 这是删除节点(节点17的子节点)并违反“高度平衡”属性后的AVL树 我读的那本书说,它将让z成为从节点17上升时遇到的第一个不平衡位置,y是高度较大的z的子对象,最后x是高度较大的y的子对象。但是,如果y的

对于AVL树,当从需要重构的树中删除节点时,我正在阅读的书指出,要选择要重构的节点,需要遵循某些规则。例如:

       44
     /   \
    17   62
        /  \
       50  78
      /  \   \
     48  54  88
这是删除节点(节点17的子节点)并违反“高度平衡”属性后的AVL树

我读的那本书说,它将让z成为从节点17上升时遇到的第一个不平衡位置,y是高度较大的z的子对象,最后x是高度较大的y的子对象。但是,如果y的子对象都具有相同的高度,则x将与y位于同一侧。在这种情况下,x是78,y是62,z是44


现在提出的问题是。为什么我们选择x,使它与y在同一侧?如果我选择x与y不在同一侧,AVL树会有任何问题吗?我试着给自己举一些例子,并尝试选择两种类型的x和,重构AVL树。然而,我似乎找不到任何因选择x作为任一子项而产生的问题。非常感谢任何帮助来帮助我解决这个问题。

有趣的是,这个话题在各种网络论坛上有很多不同的答案。我尝试创建所有可能的AVL树节点删除场景,我观察到,如果节点从AVL树的左侧删除以使树不平衡,则根据节点可用性执行LL或LR(任何可能的旋转),树就会得到平衡。 用于右节点删除的Viceversa


此外,还需要确保由于旋转而移动的节点是否有子节点,如果子节点是旋转前的左侧或右侧,则子节点将分别插入左侧或右侧

有趣..你能分享你的分析吗?你在哪里得到了不是y的孩子的x?@KarthikBalaguru有可能得到不是y的孩子的x吗?重组将如何进行?以前没有想到过这一点。按照标准的三位一体重构方法,它是通过将x作为y的子节点来实现的。简单地说,就是针对导致负载不平衡的路径,并将其固定。因此,为了识别和修复该路径,一旦违反高度平衡,z应为第一个不平衡节点,y应为z的最高子节点,x应为z的孙子节点,以使其为y的最高子节点。就我所见,三位一体重构过程一直在说——如果y的一个子元素比另一个子元素高,那么x就是更高的子元素,否则x就是y的子元素,与y的z边相同。