这段代码的时间复杂度是多少?
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
答案 0 :(得分:0)
您基本上正在访问二叉树的所有节点。
因此,时间和空间复杂度均为 O(N)(n ==个节点数)。
编辑:由于您已将列表用于队列,因此时间复杂度为 O(N ^ 2),但是仍有改进之门,它将提高性能至 O(N )。
详细信息:
时间复杂度:您使用的是 list 而不是内置的队列或双端队列。 list 的append()
或pop()
的费用为 O(1),而pop(0)
的费用为 O(N)。因此,您的代码效率不高。仅由于您选择用作队列的数据结构,所以需要 O(N ^ 2)。使用内置的queue
或deque
(仅需 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)