广度优先搜索
总结一下,思路就是:
加入元素,记录size,size就是当前这一层的元素个数。不断弹出元素,size -= 1, 同时加入弹出元素的左右孩子,直到size==0,说明当前层已经完全遍历完,然后让size=queue里面的元素个数,就是下一层一共有多少个元素,重复上述步骤。直到size==0且queue中没有元素了,就遍历完成了。
队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
LeetCode对应的题(都是同样的思路):
102.二叉树的层序遍历
107.二叉树的层次遍历II
199.二叉树的右视图
637.二叉树的层平均值
429.N叉树的层序遍历
515.在每个树行中找最大值
116.填充每个节点的下一个右侧节点指针
117.填充每个节点的下一个右侧节点指针II
104.二叉树的最大深度
111.二叉树的最小深度
102. 二叉树的层序遍历
# 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: Optional[TreeNode]) -> List[List[int]]:if not root:return []que = collections.deque([root])result = []while que:level = []for i in range(len(que)):cur = que.popleft()level.append(cur.val)if cur.left:que.append(cur.left)if cur.right:que.append(cur.right)result.append(level)return result
107. 二叉树层序遍历(按照从下层到上层的顺序输出)
# 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 levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:if not root:return []que = collections.deque([root])result = []while que:level = []for i in range(len(que)):cur = que.popleft()level.append(cur.val)if cur.left:que.append(cur.left)if cur.right:que.append(cur.right)result.append(level)return result[::-1]