问题描述
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/
9 20
/
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
解决方案
-
queue的概念用deque来实现,
popleft()
时间复杂为O(1)即可。 -
外围的While用来定义BFS的终止条件,所以我们最开始initialize queue的时候可以直接把root放进去。
-
在每层的时候,通过一个
cur_level
记录当前层的node.val
,size用来记录queue的在增加子孙node之前大小,因为之后我们会实时更新queue的大小。 -
当每次从queue中pop出来的节点,把它的左右子节点放进Queue以后,记得把节点本身的的value放进
cur_level
-
for loop
终止后,就可以把记录好的整层的数值,放入我们的return数组里。
时间复杂度:O(n)
show me the code
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
from collections import deque
if not root: return []
queue, res = deque([root]), []
while queue:
cur_level, size = [], len(queue)
for i in range(size):
node = queue.popleft()
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
cur_level.append(node.val)
res.append(cur_level)
return res
这里再介绍一种不依赖于queue的解法
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
res,level = [],[root]
while level:
res.append([node.val for node in level])
temp = []
for node in level:
temp.extend([node.left,node.right])
level = [leaf for leaf in temp if leaf]
return res
这样看起来更加优雅一些,但是牺牲了一些性能