前言
本文以【二叉树的层序遍历】的经典题目LeetCode.102为例,讲解如何通用性的解决二叉树遍历问题。
题目
通用思路
首先,阅读题干,了解题目需求:逐层、从左到右返回节点的值。
了解题目要求我们干什么之后,我们开始思考应对策略:依然先从小问题着手:我们该如何遍历得到其中一层的值?我们大概需要上一层的所有父节点给出他们所有子节点,因此在这一层我们可以遍历得到每一个节点对应的值;同时,为了得到下一层的结果,我们还需要对这每一个节点取他们的子节点到一个新的列表中。
题解
有了思路之后,直接看代码:
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if root is None:
return []
ans = []
layer_queue = [root]
while layer_queue:
size = len(layer_queue)
tmp = []
for i in range(size):
r = layer_queue.pop(0)
tmp.append(r.val)
if r.left:
layer_queue.append(r.left)
if r.right:
layer_queue.append(r.right)
ans.append(tmp)
return ans
首先判空。
我们使用ans、layer_queue、tmp三个列表。
其中ans为结果列表,用于储存所有结果数组。
layer_queue作为存放节点的列表,在每一层遍历的时候,发挥两个作用:能给出节点的值;能存储子节点。
tmp为临时列表,用于在遍历的时候存储节点的值,并将结果添加到ans中。