【问题标题】:Should I balance my AVL trees top-down or bottom-up?我应该自上而下还是自下而上平衡我的 AVL 树?
【发布时间】:2021-10-16 02:40:05
【问题描述】:

不是特定于任何语言,但我会在 python 中显示一些代码

def insert(self,i):
    temp = self
    while(True):
      if i > temp.V:
        if temp.R == None:
          temp.R = node(None,None,i)
          temp = temp.R
          break
        else:
          temp = temp.R

      else:
        if temp.L == None:
          temp.L = node(None,None,i)
          temp = temp.L
          break
        else:
          temp = temp.L

    self = self.balance()

对于类节点

def __init__(self,left,right,val):
    self.L = left
    self.R = right
    self.V = val

使用从上到下的方法,插入和平衡都是独立的功能,我想从抽象的角度来看这会很好吗??它还允许我迭代地进行插入[并且迭代比我所学的递归更快]

同时bottom to top方法在[大概更少]操作中进行平衡,但也需要与插入捆绑在一起才能工作。这也意味着我必须递归地插入元素,这比迭代成本更高。

如果我的推理有误,请纠正我,因为在我看来,这两种方法都不错。

另外,我有this example,我认为自上而下的方法比自下而上的方法更可取。

有人告诉我,自上而下的方法比自下而上的方法要慢,但我找不到任何支持或反对这一点的证据。

【问题讨论】:

  • AVL 节点通常存储余额信息。我在这里看不到这个。所以我不明白这是一个 AVL 树,以及如何有效地保持树的平衡。

标签: python data-structures binary-tree


【解决方案1】:

自上而下方法的缺点是,您不能依赖存储在 AVL 节点(-1、0 或 1)中的余额信息,因为它不能反映最新插入的效果 - - 只有插入的节点获得了尚未冒泡的最新余额信息。所以这意味着调用balance 函数(不带任何参数)需要扫描整个树!所以这将代表 O(n) 时间复杂度。

自下而上的方法只需要查看插入节点的(一些)祖先,如果需要,可能会在应用轮换之后更新其余额信息。这将具有 O(logn) 时间复杂度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2020-03-08
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多