原题
Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
解法1
宽度优先搜索, 每次用列表储存当前层的节点, 按层进行遍历, 将结果加入到ans里.然后列表更新, 储存下一层的节点.
Time: O(V), V是二叉树中节点的数量
Space: O(n)
代码
# 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):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
# edge case
if not root: return []
ans = []
q = [root]
while q:
ans.append([node.val for node in q])
new_q = []
for node in q:
if node.left:
new_q.append(node.left)
if node.right:
new_q.append(node.right)
q = new_q
return ans
解法2
解法1的简化版, 使用list comprehension, 直接得到下一层的节点. 注意如果root为空时, q为[None], 程序会报错, 因此while循环的条件是root和q都不为空.
Time: O(V), V是二叉树中节点的数量
Space: O(n)
代码
# 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):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
ans, q = [], [root]
while root and q:
ans.append([node.val for node in q])
q = [kid for node in q for kid in (node.left, node.right) if kid]
return ans