【问题标题】:Skewed binary tree vs Perfect binary tree - space complexity倾斜二叉树与完美二叉树 - 空间复杂度
【发布时间】:2020-02-13 20:31:04
【问题描述】:

倾斜二叉树是否比完美二叉树占用更多空间?

我正在解决问题 #654 - Leetcode 上的最大二叉树,给定一个数组,你必须制作一棵二叉树,根是数组中的最大数,左右子树是在最大数左右的子数组的原理相同,并且得出的结论是,在平均和最佳情况下(完美二叉树),占用的空间将是 O(log(n)),而最坏情况下(倾斜二叉树)将是 O(n)。

例如,给定 nums = [1,3,2,7,4,6​​,5], 树就是这样,

      7
    /   \
   3     6
  /  \   / \ 
 1   2  4   5

如果给定 nums = [7,6,5,4,3,2,1], 树就是这样,

7
 \
  6
 / \
    5
   / \
      4
     / \
        3
       / \
          2
         / \
            1

根据我的理解,它们都应该占用 O(n) 空间,因为它们都有 n 个节点。所以我不明白他们是如何得出这个结论的。 提前致谢。

【问题讨论】:

  • 如何向我们展示你的树是如何定义的(显示一些代码)。然后告诉我们认为答案是什么,并解释你是如何得出这个结论的。
  • 我刚刚添加了一个解释,请看一下。

标签: data-structures tree binary-tree space-complexity


【解决方案1】:

https://leetcode.com/problems/maximum-binary-tree/solution/

在“空间复杂度”下,它说:

空间复杂度:O(n)。在最坏的情况下,集合的大小可以增长到 n。在平均情况下,对于 nums 中的 n 个元素,大小将为 nlogn,平均情况复杂度为 O(logn)。

措辞不好,但它是正确的。它是在谈论构建树期间所需的内存量,而不是树本身占用的内存量。正如您正确指出的那样,树本身将占用 O(n) 空间,无论它是平衡的还是退化的。

考虑数组[1,2,3,4,5,6,7]。您希望根是最大的数字,而左边是数组中最大数字左侧的所有内容。由于数组是按升序排列的,因此您提取了7 作为根,然后进行递归调用以构造左子树。然后提取6 并进行另一个递归调用来构造该节点的左子树。您继续进行递归调用,直到您发出1。总共有六个嵌套递归调用:O(n)。

现在看看如果你的初始数组是[1,3,2,7,5,6,4] 会发生什么。您首先放置7,然后使用子数组[1,3,2] 进行递归调用。然后您放置3 并进行递归调用以放置1。你的树是:

             7
         3
       1

此时,您的调用深度为 2。您返回并放置 2。然后从两个递归调用中返回。树现在是:

             7
         3
       1   2

构建右子树也需要调用深度为 2。调用深度绝不会超过 2。这是 O(log n)。

原来调用栈的深度和树的高度是一样的。完美树的高度是O(log n),退化树的高度是O(n)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    相关资源
    最近更新 更多