题目来源:链接
题目描述:
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
代码实现:
def levelOrder(self, root: TreeNode) -> List[int]:
if not root:
return []
res,queue = [],collections.deque()
queue.append(root)
while queue:
node = queue.popleft()
res.append(node.val)
if node.left:queue.append(node.left)
if node.right:queue.append(node.right)
return res
解题思路:
可以用一个collections中的deque双端队列,这样popleft,appendleft的效率会很高
首先root不为空的话,先把root加入队列
循环中将节点队列出列popleft,res将出列的节点的value加入
判断出列节点左子树,右子树是否为空,非空则加入队列
题目来源:链接
题目描述:
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
代码实现:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:return []
res,queue = [],collections.deque()
queue.append(root)
while queue:
tmp = []
for _ in range(len(queue)):
node = queue.popleft()
tmp.append(node.val)
if node.left:queue.append(node.left)
if node.right:queue.append(node.right)
res.append(tmp)
return res
解题思路:
还是一样的队列思想,只是结果res需要分层次
所以需要两层循环,基本思路还是和第一题一样的
题目来源:链接
题目描述:
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
代码实现:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:return []
res,dq = [],collections.deque()
dq.append(root)
while dq:
tmp = collections.deque()
for _ in range(len(dq)):
node = dq.popleft()
if len(res)%2:
tmp.appendleft(node.val)
else:
tmp.append(node.val)
if node.left:dq.append(node.left)
if node.right:dq.append(node.right)
res.append(list(tmp))
return res
解题思路:
基本思路依旧是队列
又进行了变种,需要在偶数层倒序输出,
只需要判断res的长度即可,每一层都会添加一个tmp到res中
tmp因为是deque,要append需要先转换成list