【问题标题】:Space complexity of construction of a binary tree from inorder and preorder traversals从中序和前序遍历构造二叉树的空间复杂度
【发布时间】:2018-06-05 02:36:24
【问题描述】:

这个问题是关于空间而不是时间复杂度的。此外,这不是关于如何解决问题,因为我能够做到。我试图在我的解决方案中找出算法的空间复杂度。我在 Leetcode 上找到了question。可以在那里找到假设和问题描述。

我理解StackOverflow post 中解释的时间复杂度,但这篇文章没有谈到空间复杂度。

我尝试在代码结束后对其进行解释。

# Definition for a binary tree node.
class TreeNode(object):
  def __init__(self, x):
    self.val = x
    self.left = None
    self.right = None

class Solution(object):
  def buildTree(self, preorder, inorder):
    """
    :type preorder: List[int]
    :type inorder: List[int]
    :rtype: TreeNode
    """
    preorder.reverse()
    return self.buildTreeHelper(preorder, inorder)

  def buildTreeHelper(self, preorder, inorder):
    if not preorder or not inorder:
      return None

    rootValue = preorder.pop()
    root = TreeNode(rootValue)

    inorderRootIndex = inorder.index(rootValue)

    root.left = self.buildTreeHelper(preorder, inorder[:inorderRootIndex])
    root.right = self.buildTreeHelper(preorder, inorder[inorderRootIndex+1:])
    return root

因为我在递归函数中发送列表的切片,所以我使用了更多空间。如果我们不考虑清理空间,那么列表切片需要 O(n^2) 空间。我们可以假设我们正在清理这个空间,但是对于每一步,我们为所有 n 步传递 2n 个长度的数组 [pre & inorder]。如果我们考虑清理空间,空间复杂度是多少?

此外,在最坏的情况下,树可能是一个链表,因此由于递归而在调用堆栈中占用的空间也将是 O(n)。

说空间复杂度为 O(n^3) 是否有意义,因为调用堆栈的每次添加或我是否重复计算了创建额外的功率?

【问题讨论】:

    标签: python binary-tree big-o inorder preorder


    【解决方案1】:

    代码的最坏情况空间复杂度是O(n^2)。您的基本分析似乎非常正确。每个递归调用(对于切片)都需要O(n) 空间,在最坏的情况下,您的递归深度也可能是n

    由于您有两个列表或递归调用堆栈占用的空间,因此无需乘以额外的 n 术语。这些问题最多会将其从n^2 更改为2*n^2n^2 + n,并且大O 表示法会忽略诸如此类的常数倍数和增长较慢的术语。

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多