面试题32.从上打印二叉树(1, 2 ,3)
从上打印二叉树.1
变体2
变体3
一刷:
1. 没有考虑root为None的情况
2. res_level在for中添加了导致输出出现错误
3. 没有正确的将res_level作为【】添加进res
#Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
from collections import deque
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
'''
1 利用BFS,找到所有路径,注意BFS中的坑,比如向res中添加next_level添加的时机。
2 不能使用列表作为now_level的容器,因为列表的pop(0)时间复杂度为O(n)
3 deque不能直接用root创建需要变成list类型
'''
if root is None:
return []
res = []
now_level = deque([root])
while now_level:
res_level = []
for _ in range(len(now_level)):
now_root = now_level.popleft()
if now_root.left is not None:
now_level.append(now_root.left)
if now_root.right is not None:
now_level.append(now_root.right)
res_level.append(now_root.val)
res.append(res_level)
#问题1:
#res = res + res_level
return res
问题3:
有前两题的基础:用len(res)计算奇偶,改变res_level添加形式,就可以得出正确结果。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
from collections import deque
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if root is None:
return []
res = []
now_level = deque([root])
while now_level:
res_level = deque([])
for _ in range(len(now_level)):
now_root = now_level.popleft()
if (len(res) + 1) % 2 == 1:
res_level.append(now_root.val)
else:
res_level.appendleft(now_root.val)
if now_root.left is not None:
now_level.append(now_root.left)
if now_root.right is not None:
now_level.append(now_root.right)
res.append(list(res_level))
return res