该代码的时间,空间复杂度是多少?

时间:2020-09-20 02:48:27

标签: python big-o

这段代码的时间复杂度是多少?

if not root:
    return 0 
    
if root.left is None and root.right is None:
    return 1

que = []
que.append(root)
maximum = 0
while que:
    for i in range(len(que)):
        node = que.pop(0)
        if node.left:
            que.append(node.left)
        if node.right:
            que.append(node.right)
    maximum += 1
return maximum

2 个答案:

答案 0 :(得分:0)

您基本上正在访问二叉树的所有节点。

因此,时间和空间复杂度均为 O(N)(n ==个节点数)。

编辑:由于您已将列表用于队列,因此时间复杂度为 O(N ^ 2),但是仍有改进之门,它将提高性能至 O(N )

详细信息:

时间复杂度:您使用的是 list 而不是内置的队列或双端队列。 list append()pop()的费用为 O(1),而pop(0)的费用为 O(N)。因此,您的代码效率不高。仅由于您选择用作队列的数据结构,所以需要 O(N ^ 2)。使用内置的queuedeque(仅需 O(1)即可插入和弹出第一个元素)。如果是这样,时间复杂度将为 O(N)

空间复杂度:该算法一次遍历二叉树一个级别,因此在包含叶节点的最高级别上达到了队列中的最大项目数。
完整的二叉树具有(n + 1)/ 2个叶节点。 O((n + 1)/ 2) = O(N)

答案 1 :(得分:0)

我也同意时空复杂度为O(n),其中n是代码数。但是,我认为对结果的更详细解释可以如下(假设root是树的根):

  • 时间复杂度:每个节点仅进入que一次,而离开que一次。节点离开时,最多执行2个检查和2个追加。当que为空时,程序结束,导致时间复杂度为(2+2)*n=4n --> O(n)
  • 空间复杂度:que在任何时候最多只能容纳图中的所有节点,导致空间复杂度为O(n)