来源

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

描述

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

3
/ \
9 20
/ \
15 7

返回其层次遍历结果:

[
[3],
[9,20],
[15,7]
]

题解

如何遍历一棵树,有两种通用的遍历树的策略:

  • 深度优先搜索(DFS)

在这个策略中,我们采用深度作为优先级,以便从根开始一直到达某个确定的叶子,然后再返回根到达另一个分支。
深度优先搜索策略又可以根据根节点、左孩子和右孩子的相对顺序被细分为先序遍历中序遍历后序遍历

  • 宽度优先搜索(BFS)

我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到。

递归法

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11. List<List<Integer>> levels = new ArrayList<List<Integer>>();
  12. public List<List<Integer>> levelOrder(TreeNode root) {
  13. if (root == null) return levels;
  14. helper(root, 0);
  15. return levels;
  16. }
  17. public void helper(TreeNode node, int level) {
  18. if (levels.size() == level) {
  19. levels.add(new ArrayList<Integer>());
  20. }
  21. levels.get(level).add(node.val);
  22. if (node.left != null) helper(node.left, level + 1);
  23. if (node.right != null) helper(node.right, level + 1);
  24. }
  25. }
  • 时间复杂度:102. 二叉树的层次遍历(Binary Tree Level Order Traversal) - 图1,因为每个节点恰好会被运算一次。
  • 空间复杂度:102. 二叉树的层次遍历(Binary Tree Level Order Traversal) - 图2,保存输出结果的数组包含 N 个节点的值。

    迭代法

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode(int x) { val = x; }
    8. * }
    9. */
    10. class Solution {
    11. public List<List<Integer>> levelOrder(TreeNode root) {
    12. List<List<Integer>> levels = new ArrayList<List<Integer>>();
    13. if (root == null) return levels;
    14. Deque<TreeNode> deque = new LinkedList<>();
    15. deque.add(root);
    16. int level = 0;
    17. while (!deque.isEmpty()) {
    18. levels.add(new ArrayList<Integer>());
    19. int dequeSize = deque.size();
    20. for (int i = 0; i < dequeSize; i++) {
    21. TreeNode node = deque.remove();
    22. levels.get(level).add(node.val);
    23. if (node.left != null) deque.add(node.left);
    24. if (node.right != null) deque.add(node.right);
    25. }
    26. level++;
    27. }
    28. return levels;
    29. }
    30. }

    复杂度分析

  • 时间复杂度:102. 二叉树的层次遍历(Binary Tree Level Order Traversal) - 图3,因为每个节点恰好会被运算一次。

  • 空间复杂度:102. 二叉树的层次遍历(Binary Tree Level Order Traversal) - 图4,保存输出结果的数组包含 N 个节点的值。