二叉树的广度优先搜索BFS

解题思路:

题目要求的二叉树的 从上至下打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。
BFS 通常借助 队列 的先入先出特性来实现。

09-二叉树的广度优先搜索BFS - 图1

算法流程:

特例处理: 当树的根节点为空,则直接返回空列表 [] ;
初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;
BFS 循环: 当队列 queue 为空时跳出;
出队: 队首元素出队,记为 node;
打印: 将 node.val 添加至列表 tmp 尾部;
添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
返回值: 返回打印结果列表 res 即可。

复杂度分析:

时间复杂度 O(N) : N为二叉树的节点数量,即 BFS 需循环 N 次。
空间复杂度 O(N) : 最差情况下,即当树为平衡二叉树时,最多有 N/2个树节点同时在 queue 中,使用 O(N)大小的额外空间。

  1. //Java
  2. class Solution {
  3. public int[] levelOrder(TreeNode root) {
  4. if(root == null) return new int[0];
  5. Queue<TreeNode> queue = new LinkedList<>(){{ add(root); }};
  6. ArrayList<Integer> ans = new ArrayList<>();
  7. while(!queue.isEmpty()) {
  8. TreeNode node = queue.poll();
  9. ans.add(node.val);
  10. if(node.left != null) queue.add(node.left);
  11. if(node.right != null) queue.add(node.right);
  12. }
  13. int[] res = new int[ans.size()];
  14. for(int i = 0; i < ans.size(); i++)
  15. res[i] = ans.get(i);
  16. return res;
  17. }
  18. }
  1. #Python
  2. class Solution:
  3. def levelOrder(self, root: TreeNode) -> List[int]:
  4. if not root: return []
  5. res, queue = [], collections.deque()
  6. queue.append(root)
  7. while queue:
  8. node = queue.popleft()
  9. res.append(node.val)
  10. if node.left: queue.append(node.left)
  11. if node.right: queue.append(node.right)
  12. return res