leetcode-102

102. 二叉树的层序遍历

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例:

二叉树:[3,9,20,null,null,15,7],

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

返回其层序遍历结果:

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

解法一

使用字典来保存层次信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
res = dict()
queue = list()

queue.append((root,0))

while queue:
cur,cur_floor = queue.pop(0) # 获得当前,节点与层
if cur_floor not in res.keys():
res[cur_floor] = [cur.val]
else:
# print(res)
res[cur_floor].append(cur.val)

# print(cur.val)
# res.append(cur.val)
if cur.left:
queue.append((cur.left,cur_floor+1))
if cur.right:
queue.append((cur.right,cur_floor+1))
return list(res.values())

解法二:官方题解

考虑如何优化空间开销:如何不用哈希映射,并且只用一个变量 node 表示状态,实现这个功能呢?

我们可以用一种巧妙的方法修改广度优先搜索:

  • 首先根元素入队
  • 当队列不为空的时候
    • 求当前队列的长度$s_i$
    • 依次从队列中取$s_i$个元素进行拓展,然后进入下一次迭代。

它和普通广度优先搜索的区别在于,普通广度优先搜索每次只取一个元素拓展,而这里每次取$s_i$个元素。在上述过程中的第$i$次迭代就得到了二叉树的第$i$层的$s_i$个元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def bfs2(self,root:TreeNode):
if not root:
return []
res = []
queue = list()
queue.append(root)
while queue:
temp = []
q_length = len(queue)
for i in range(q_length):
cur = queue.pop(0)
temp.append(cur.val)

if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)

res.append(temp)
return res
作者

bd160jbgm

发布于

2021-05-26

更新于

2021-05-26

许可协议