1.题目描述
给你二叉树的根节点
root
,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]输入:root = [1]
输出:[[1]]输入:root = []
输出:[]提示:
- 树中节点数目在范围
[0, 2000]
内-1000 <= Node.val <= 1000
2.思路分析
2.1 广度优先搜索
树的层次遍历可以使用广度优先搜索实现。从根节点开始搜索,每次遍历同一层的全部节点,使用一个列表存储该层的节点值。最后将存储结果的反转即可。
2.2 深度优先搜索
- 为了让递归的过程中同一层的节点放到同一个列表中,在递归时要记录每个节点的深度 level。递归到新节点要把该节点放入 level 对应列表的末尾。
- 当遍历到一个新的深度 level,而最终结果 res 中还没有创建 level 对应的列表时,应该在 res 中新建一个列表用来保存该 level 的所有节点。
3.代码实现
3.1 广度优先搜索
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
# 迭代法 使用队列模拟递归
result = []
if not root:
return result
from collections import deque
que = deque([root])
while que:
res =[]
for _ in range(len(que)):
cur = que.popleft()
res.append(cur.val)
if cur.left:
que.append(cur.left)
if cur.right:
que.append(cur.right)
result.append(res)
return result[::-1]
3.2 深度优先搜索
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
# 递归法 层序遍历
result = []
def level(root: TreeNode, depth: int, result: List[int]) -> None:
if not root:
return
if depth == len(result):
result.append([])
result[depth].append(root.val)
level(root.left, depth + 1, result)
level(root.right, depth + 1, result)
level(root, 0, result)
return result[::-1]