【问题标题】:AVL tree: difference between leaves' depths?AVL树:叶子深度之间的差异?
【发布时间】:2018-12-05 18:14:58
【问题描述】:

测试中的一个问题:

设T 是一棵AVL 树,x,y 是树中的两片叶子(x != y)。 depth(x) - depth(y)的最大值是多少?

A. 0
B. 1
C. 2
D. None of the above

正确的 (?) 答案是 D。有人可以解释为什么它不是 B,因为 AVL 属性之一是 height(a.left) - height(a.right) <= 1 用于每个节点 a?

【问题讨论】:

    标签: data-structures binary-tree avl-tree


    【解决方案1】:

    用一般的方式解释比展示反例需要更多的时间。因此,考虑以下 8 阶斐波那契树,它是一棵 AVL 树:

    以深度为从根到节点的边数,叶子0的深度为7,叶子52的深度为4。差异为3。与其他更大的AVL树,差异可能更大。

    请记住,树 AVL 的作用是每个节点的左右子树的高度差小于或等于 1。深度是另一回事。

    说实话,这是一个棘手的问题。

    【讨论】:

    • 这对我来说似乎很奇怪,因为树必须保持平衡才能使操作为 O(logn)。没有?
    • 是的。但是算法之所以有效,是因为它是 AVL。从某种意义上说,斐波那契树是批评家 AVL,如果您删除除 0 以外的任何叶子,则该树将不再是 AVL。它是一种边界树,该概念用于演示 AVL 树的最大高度。它的定义是递归的。 Fib(0) = 0 和 Fib(1) = 1。下一个 Fib(i) = 。对于每个非叶节点,左侧树的高度为 i - 1,右侧树的高度为 i - 2。因此,高度差始终为 -1,树为 AVL。您可以查看 Knuth V1
    【解决方案2】:

    AVL 树保证“最坏”情况的查找时间为 O(log(n))。它保证了任意两个子树的高度差最多为1。但这并不能保证整个树的最低节点和最高节点之间的高度差为1。在一棵大树中,有可能变大整个树的高度差异。

    理解 AVL 树的关键是理解它对“子树”的定义。对于任何给定的节点,都有 2 个子树,有时称为左子树和右子树。这两个子树之间的高度差最多为 1。现在想象这两个子树都可以附加到一个节点并成为更大树中的一个子树。这个新的子树,称为节点的左子树,与同一节点上的右子树的高度差最多为 1。但这也意味着整棵树中任意 2 片叶子之间的最大高度差为 2。这个过程可以重复,AVL 树的任意叶子之间可以有很大的高度差,但仍然保持它的大 O 运行时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多