备案期间关闭网站排名优化seo公司
题目:
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示:
-
树中节点数目在范围 [0, 2000] 内
-
-1000 <= Node.val <= 1000
思路如下:
广度优先搜索(BFS),可以使用两个数组或使用一个队列来辅助完成。
题解如下:
#两个数组
class Solution:def levelOrder(self, root):""":type: root: Optional[TreeNode]:rtype: List[List[int]]"""if root is None:return []ans = []cur = [root]while cur:nxt = [] # 存储下一层的节点vals = [] # 存储当前层的节点值for node in cur:vals.append(node.val) # 收集当前层节点的值if node.left: nxt.append(node.left) # 左子节点加入下一层if node.right:nxt.append(node.right) # 右子节点加入下一层cur = nxt # 更新当前层为下一层ans.append(vals) # 将当前层结果加入最终列表return ans
#一个队列
class Solution:def levelOrder(self, root):""":type: root: Optional[TreeNode]:rtype: List[List[int]]"""if root is None:return []ans = []q = deque([root])while q:vals = []for _ in range(len(q)): # 固定当前层的节点数量node = q.popleft() # 弹出队列最左侧节点(先进先出)vals.append(node.val)if node.left: q.append(node.left) # 左子节点加入队列if node.right:q.append(node.right) # 右子节点加入队列ans.append(vals)return ans
示例流程:
1 / \ 2 3 / \ 4 5
#两个数组
第1层:cur = [1] → vals = [1] → nxt = [2, 3] → ans = [[1]]
第2层:cur = [2, 3] → vals = [2, 3] → nxt = [4, 5] → ans = [[1], [2, 3]]
第3层:cur = [4, 5] → vals = [4, 5] → nxt = [] → ans = [[1], [2, 3], [4, 5]]
最终结果:[[1], [2, 3], [4, 5]]。
#一个队列
第1层:q = [1] → 处理 1 → vals = [1] → q = [2, 3] → ans = [[1]]
第2层:q = [2, 3] → 处理 2, 3 → vals = [2, 3] → q = [4, 5] → ans = [[1], [2, 3]]
第3层:q = [4, 5] → 处理 4, 5 → vals = [4, 5] → q = [] → ans = [[1], [2, 3], [4, 5]]
最终结果:[[1], [2, 3], [4, 5]]。