思路
层序遍历:逐层从左到右访问节点
用队列,先进先出
- 迭代法:推荐
使用双头队列deque放置每一层的结点
时间复杂度O(n):虽然while和for,但每个结点进一次,出一次,O(1)*N=O(n)
空间复杂度O(n)
BFS的模板背下来
# 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]]:
#迭代法
res=[]
#为空处理
if not root:
return res
#用双头队列
from collections import deque
que=deque([root])
while que:
size=len(que)
tmp_res=[]
#当前层遍历
for _ in range(size):
cur=que.popleft()
tmp_res.append(cur.val)
if cur.left:
que.append(cur.left)
if cur.right:
que.append(cur.right)
res.append(tmp_res)
return res
- 递归法:不推荐,递归适合深度优先搜索
# 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]]:
#递归法
res=[]
def helper(root, depth):
#终止条件
if not root:
return []
if len(res)==depth:
#开始当前层遍历
res.append([])
#填充当前层
res[depth].append(root.val)
#开始下一层
if root.left:
helper(root.left, depth+1)
if root.right:
helper(root.right, depth+1)
helper(root,0)
return res