Data structures 偏斜二叉树与完美二叉树-空间复杂度

Data structures 偏斜二叉树与完美二叉树-空间复杂度,data-structures,tree,binary-tree,space-complexity,Data Structures,Tree,Binary Tree,Space Complexity,偏斜二叉树比完美二叉树占用更多的空间吗 我在解决一个问题#654-Leetcode上的最大二叉树,给定一个数组,你必须生成一个二叉树,根是数组中的最大数,左、右子树是由最大数左右的子数组按照相同的原理生成的,在平均和最佳情况下(完美二叉树)占用的空间为O(log(n)),最坏情况(倾斜二叉树)为O(n) 例如,给定nums=[1,3,2,7,4,6,5], 这棵树应该是这样的 7 / \ 3 6 / \ / \ 1 2 4 5 7

偏斜二叉树比完美二叉树占用更多的空间吗

我在解决一个问题#654-Leetcode上的最大二叉树,给定一个数组,你必须生成一个二叉树,根是数组中的最大数,左、右子树是由最大数左右的子数组按照相同的原理生成的,在平均和最佳情况下(完美二叉树)占用的空间为O(log(n)),最坏情况(倾斜二叉树)为O(n)

例如,给定nums=[1,3,2,7,4,6,5], 这棵树应该是这样的

      7
    /   \
   3     6
  /  \   / \ 
 1   2  4   5
7
 \
  6
 / \
    5
   / \
      4
     / \
        3
       / \
          2
         / \
            1
如果给定nums=[7,6,5,4,3,2,1], 这棵树应该是这样的

      7
    /   \
   3     6
  /  \   / \ 
 1   2  4   5
7
 \
  6
 / \
    5
   / \
      4
     / \
        3
       / \
          2
         / \
            1
根据我的理解,它们都应该取O(n)空间,因为它们都有n个节点,所以我不明白它们是如何得出这个结论的。 提前谢谢。

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

空间复杂度:O(n)。在最坏的情况下,集合的大小可以增长到n。在平均情况下,n个元素的大小将为nlogn(以nums为单位),因此平均案例复杂度为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(logn)


结果表明,调用堆栈深度与树的高度相同。完美树的高度为O(logn),退化树的高度为O(n)。

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