【发布时间】: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