107.二叉树的层序遍历II

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例 1:

image1

输入: root = [3,9,20,null,null,15,7]
输出: [[15,7],[9,20],[3]]

示例 2:

输入: root = [1]
输出: [[1]]

示例 3:

输入: root = []
输出: []

提示:

  • 树中节点数目在范围 [0, 2000]
  • 1000 <= Node.val <= 1000

Related Topics

  • 广度优先搜索
  • 二叉树

题目链接: link

解答

本题的难度是 Medium.

一开始写的很抽象, 先创建一个 HashMap, 然后记录最大深度, 然后再倒序插入到 result 里.

代码如下:

class Solution {
    private int maxDepth = -1;
    HashMap<Integer, ArrayList<Integer>> hashMap = new HashMap();
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        levelOrder(root, 0);
        List<List<Integer>> result = new ArrayList<>();
        for (int i = maxDepth; i >= 0 ; i--) {
            result.add(hashMap.get(i));
        }
        return result;
    }

    private void levelOrder(TreeNode node, int depth){
        if (node == null){return;}
        if (depth > maxDepth) { maxDepth = depth;}
        if (!hashMap.containsKey(depth)){
            hashMap.put(depth, new ArrayList<>());
        }
        ArrayList<Integer> list = hashMap.get(depth);
        list.add(node.val);
        hashMap.put(depth, list);
        levelOrder(node.left, depth+1);
        levelOrder(node.right, depth+1);
    }
}

1ms, 击败 92.43% 的提交.

然后发现根本不用这样做, 本质还是层序遍历, 把层序遍历倒一下就好了, 于是改了一下.

class Solution {
    List<List<Integer>> lists = new ArrayList<>();
    public List<List<Integer>> levelOrderBottom(TreeNode root) {

        ceng(0, root);
        Collections.reverse(lists);
        return lists;
    }

    private void ceng(int cengIndex, TreeNode node){
        if(node == null ){return ;}
        if(lists.size() < (1+cengIndex)){
            lists.add(new ArrayList<>());
        }
        lists.get(cengIndex).add(node.val);
        ceng(cengIndex+1, node.left);
        ceng(cengIndex+1, node.right);
    }
}

好好好, 0ms, 击败 100% 的提交.