剑指 Offer 32 - II. 从上到下打印二叉树 II

in with 0 comment

剑指 Offer 32 - II. 从上到下打印二叉树 II

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

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

    3
   / \
  9  20
    /  \
   15   7
返回其层次遍历结果:

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  1. BFS,广度优先,迭代遍历,使用队列存储节点,初始化将 root 节点入队,队列长度即为树分层后每一层的元素个数,以此循环出队,将其左右节点再入队,并且在出队时保存该值,最终将结果 add 到 list 中即可。
  2. DFS,深度优先,递归遍历,需要申明全局变量来保存结果。递归定义时加入层数参数,如果节点为空退出递归。如果结果的 size 小于层数,给结果中添加一个 new list,再给当前层(list.get(depth - 1))的 list add node.val,分别对节点的左右子树递归,最终返回结果。

代码

解法一

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        List<List<Integer>> res = new ArrayList<>();
        if (root != null) queue.add(root);
        while (!queue.isEmpty()) {
            List<Integer> tmp = new ArrayList<>();
            for (int i = queue.size(); i > 0; i--) {
                TreeNode node = queue.poll();
                tmp.add(node.val);
                if (node.left != null) queue.add(node.left);
                if (node.right != null) queue.add(node.right); 
            } 
            res.add(tmp);
        }
        return res;
    }
}

解法二

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    List<List<Integer>> res = new ArrayList<>();

    public List<List<Integer>> levelOrder(TreeNode root) {
        dfs(root, 1);
        return res;
    }

    public void dfs(TreeNode node, int depth) {
        if (node == null) return;
        if (res.size() < depth) res.add(new ArrayList<>());
        res.get(depth - 1).add(node.val);
        dfs(node.left, depth + 1);
        dfs(node.right, depth + 1);
    }
}