时间:2020-8-3
题目地址:
https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
题目难度:
Medium
题目描述:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
思路1:BFS 多处理一步
在每一层遍历开始前,先记录队列中的结点数量 n(也就是这一层的结点数量),然后一口气处理完这一层的 n 个结点。
代码段1:通过
# 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]]:
if root == None: return []
stack = [root]
res = []
while stack:
n = len(stack)
temp = []
for i in range(n):
node = stack[0]
del stack[0]
temp.append(node.val)
if node.left != None:
stack.append(node.left)
if node.right != None:
stack.append(node.right)
res.append(temp)
return res
总结:
-
BFS好写,关键是要 二维数组这个点,需要改进一下,我自己没啥思路,看了一下别人的算法,写出来
-
后续做一下 层序遍历的一些变种题目:
LeetCode 103. Binary Tree Zigzag Level Order Traversal 之字形层序遍历
LeetCode 199. Binary Tree Right Side View 找每一层的最右结点
LeetCode 515. Find Largest Value in Each Tree Row 计算每一层的最大值
LeetCode 637. Average of Levels in Binary Tree 计算每一层的平均值 -
BFS的应用:层序遍历、最短路径【LeetCode 1162. As Far from Land as Possible 离开陆地的最远距离(Medium)】
-
fuxuemingzhu大佬总结的模版
# 如果不需要确定当前遍历到了哪一层,BFS模板如下。
while queue 不空:
cur = queue.pop()
for 节点 in cur的所有相邻节点:
if 该节点有效且未访问过:
queue.push(该节点)
"""
如果要确定当前遍历到了哪一层,BFS模板如下。
这里增加了level表示当前遍历到二叉树中的哪一层了,也可以理解为在一个图中,现在已经走了多少步了。size表示在当前遍历层有多少个元素,也就是队列中的元素数,我们把这些元素一次性遍历完,即把当前层的所有元素都向外走了一步。
"""
level = 0
while queue 不空:
size = queue.size()
while (size --) {
cur = queue.pop()
for 节点 in cur的所有相邻节点:
if 该节点有效且未被访问过:
queue.push(该节点)
}
level ++;
后续优化: