[LeetCode]102. 二叉树的层次遍历(Binary Tree Level Order Traversal)

题目描述

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

例如:
给定二叉树: [3,9,20,null,null,15,7],

3
/ \
9 20
/ \
15 7

返回其层次遍历结果:

[
[3],
[9,20],
[15,7]
]

解题思路

  1. 解法一:递归。DFS。
  2. 解法二:迭代。BFS。

代码

解法一:递归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 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]]:
levels = []
if root is None:
return levels

def helper(node, level):
if level == len(levels):
levels.append([])
levels[level].append(node.val)
if node.left is not None:
helper(node.left, level + 1)
if node.right is not None:
helper(node.right, level + 1)

helper(root, 0)
return levels

执行用时 : 100 ms
内存消耗 : 14.7 MB

解法二:迭代

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
# 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]]:
levels = []
if root is None:
return levels

queue = [root]
level = 0
while queue:
levels.append([])
length = len(queue)
for _ in range(length):
node = queue.pop(0)
levels[level].append(node.val)
if node.left is not None:
queue.append(node.left)
if node.right is not None:
queue.append(node.right)
level += 1
return levels

执行用时 : 56 ms
内存消耗 : 14 MB