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],

1
2
3
4
5
3
/ \
9 20
/ \
15 7

return its level order traversal as:

1
2
3
4
5
[
[3],
[9,20],
[15,7]
]

思路

二叉树的层次优先遍历,需要涉及广度优先搜索(BFS)。将节点按层次出入队列可以轻松地输出连续的层次优先遍历结果。但是如果需要对每一层分别进行输出,就比较有技巧了。

比较常用的办法是使用空节点来充当层与层之间的分隔符,在python当中用None来表示。当队头访问到空节点后,队尾相应补充一个空节点,是为下一层的分隔符。需要注意的是,队列当中不能够添加额外的空节点,以防分层错乱;如果访问到树的底部,需要注意不要再添加空节点,以防陷入死循环。

python有自带的Queue(队列)类。在这里我利用list实现了一个简单的Queue,也可以实现同样的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
q = []
level = []
res = []
if (root):
q.append(root)
q.append(None)
else:
return q
while(len(q) > 0):
node = q[0]
level.append(node)
del q[0]
if(node):
if(node.left):
q.append(node.left)
if(node.right):
q.append(node.right)
else:
values = []
for i in level:
if (i):
values.append(i.val)
res.append(values)
level = []
if(len(q) > 0):
q.append(None)
return res