最近再做力扣上102. 二叉树的层序遍历添加链接描述时,写出了下面代码,提示超出内存限制。
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
result = []
if root is None:
return []
queue = collections.deque([root])
while queue != []:
temp = []
for _ in range(len(queue)):
cur = queue.popleft()
temp.append(cur.val)
if cur.left is not None:
queue.append(cur.left)
if cur.right is not None:
queue.append(cur.right)
result.append(temp[:])
return result
经常查阅相关资料才知道while queue
和 while queue != []
的本质区别在于,前者会将队列隐式地转换为布尔值,如果队列为空则为 False,否则为 True;而后者则需要显式地将队列和空列表进行比较,判断队列是否为空。
在 Python 中,列表和其他容器类型的布尔值都是 True
,除非它们是空的。因此,在使用 while queue
时,Python 只需要判断队列是否为空,而不需要创建一个新的空列表对象进行比较。这样可以避免创建新的对象,减少了内存占用。
相比之下,使用 while queue != []
需要创建一个新的空列表对象,并将其和队列进行比较。在循环执行的过程中,可能会多次创建和销毁这个空列表对象,导致内存占用过高。
因此,建议在 Python 中使用 while queue
来判断队列是否为空,以避免不必要的内存占用。
可以通过的代码如下:
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
result = []
if root is None:
return []
queue = collections.deque([root])
while queue:
temp = []
for _ in range(len(queue)):
cur = queue.popleft()
temp.append(cur.val)
if cur.left is not None:
queue.append(cur.left)
if cur.right is not None:
queue.append(cur.right)
result.append(temp[:])
return result