LeetCode 107. 二叉树的层序遍历 II

Posted 数据结构和算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 107. 二叉树的层序遍历 II相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

想看更多算法题,可以扫描上方二维码关注我微信公众号“数据结构和算法”,截止到目前我已经在公众号中更新了500多道算法题,其中部分已经整理成了pdf文档,截止到目前总共有1000多页(并且还会不断的增加),可以在公众号中回复关键字“pdf”即可下载。

在这里插入图片描述
在这里插入图片描述

public List<List<Integer>> levelOrderBottom(TreeNode root) {
    //边界条件判断
    if (root == null)
        return new ArrayList<>();
    //队列
    Queue<TreeNode> queue = new LinkedList<>();
    List<List<Integer>> res = new ArrayList<>();
    //根节点入队
    queue.add(root);
    //如果队列不为空就继续循环
    while (!queue.isEmpty()) {
        //BFS打印,levelCount表示的是每层的结点数
        int levelCount = queue.size();
        //subList存储的是每层的结点值
        List<Integer> subList = new ArrayList<>();
        for (int i = 0; i < levelCount; i++) {
            //出队
            TreeNode node = queue.poll();
            subList.add(node.val);
            //左右子节点如果不为空就加入到队列中
            if (node.left != null)
                queue.add(node.left);
            if (node.right != null)
                queue.add(node.right);
        }
        //把每层的结点值存储在res中,插入到最前面
        //(类似于从下往上打印,关键点在这)
        res.add(0, subList);
    }
    return res;
}

DFS解决

在前面讲《373,数据结构-6,树》的时候提到过二叉树的BFS和DFS,其中DFS是一直往下走的,到叶子节点然后再返回。对于这道题我们从根节点往下走的时候,每一层都会有一个集合list,用来存放当前层的节点值,如果当前层的list没有创建,就先创建。原理也比较简单,来看下代码

public List<List<Integer>> levelOrderBottom(TreeNode root) {
    List<List<Integer>> res = new ArrayList<>();
    helper(res, root, 0);
    return res;
}

public void helper(List<List<Integer>> list, TreeNode root, int level) {
    //边界条件判断
    if (root == null)
        return;
    //如果level等于list的长度,说明到下一层了,
    //并且下一层的ArrayList还没有初始化,我们要
    //先初始化一个ArrayList,然后放进去。
    if (level == list.size()) {
        list.add(0, new ArrayList<>());
    }
    //这里就相当于从后往前打印了
    list.get(list.size() - level - 1).add(root.val);
    //当前节点访问完之后,再使用递归的方式分别访问当前节点的左右子节点
    helper(list, root.left, level + 1);
    helper(list, root.right, level + 1);
}

总结

只要明白二叉树的BFS遍历,这题就很容易解决,虽然这题结果是从下往上,但我们只需要在每层节点值存储的时候修改一下位置即可。

以上是关于LeetCode 107. 二叉树的层序遍历 II的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第107题—二叉树的层序遍历II—Python实现

Leetcode No.107 二叉树的层序遍历 II

Leetcode刷题100天—107. 二叉树的层序遍历 II(二叉树)—day08

LeetCode 107. 二叉树的层序遍历 II

LeetCode 0107.二叉树的层序遍历II - 另一种方法

107. 二叉树的层序遍历 II