力扣第107题-二叉树的层序遍历 II

209 阅读3分钟

「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

前言

力扣第107题 二叉树的层序遍历 II 如下所示:

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

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

    3
   / \
  9  20
    /  \
   15   7

返回其自底向上的层序遍历为:

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

一、思路

这一题和前面的 力扣102题-二叉树的层序遍历 基本是一样的,唯一不同的是需要将 层序遍历的结果逆序输出

题目中有两个点比较重要:

  • 每一层从左至右遍历
  • 最终的结果集为 自底向上 的遍历结果

要得到 自底向上 的结果,是比较容易实现的。我们可以将 从上而下 每层遍历的结果都加入到 链表的头部,这样最终的结果就是:最后一层遍历的结果在第一个,第一层的结果在链表中是最后一个。

那如何 从上而下 遍历这个二叉树呢? 其实,这个也是很好实现的。

首先,遍历二叉树我们首选递归(虽然某个节点的子树是不确定的,但是递归可以一直向下,直到找到叶子节点)。我们在递归中保存每一层的节点,接口。

举个例子

这里我们使用示例一中的 [3,9,20,null,null,15,7] 作为例子

一些变量说明:
List<List<Integer>> ret:结果集 List<TreeNode> currentLevel:当前层的节点
List<TreeNode> nextLevel:下一层的节点
注:当每一层遍历结束后,都需要将这一层节点的不为空的左右孩子加入到下一层节点集 nextLevel

  1. 遍历第一层:此时currentLevel = [3],将遍历到的结果 [3] 加入结果集 ret 的头部。再将根节点的左右孩子放到下一层节点中, nextLevel = [9, 20]
  2. 遍历第二层:此时currentLevel = [9, 20],将遍历到的结果 [9, 20] 加入结果集 ret的头部,结果集此时为 [[9, 20], [3]]。再将各节点不为空的左右孩子放到下一层节点中, nextLevel = [15, 7]
  3. 遍历第三层:此时currentLevel = [15, 7],将遍历到的结果 [15, 7] 加入结果集 ret的头部,结果集此时为 [[15, 7], [9, 20], [3]]。因各节点都没有孩子了,故结束遍历
  4. 返回结果集 [[15, 7], [9, 20], [3]] 即可

二、实现

实现代码

    private List<List<Integer>> ret;

    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        ret = new LinkedList<>();
        if (root != null)
            dfs(Collections.singletonList(root));
        return ret;
    }

    public void dfs(List<TreeNode> currentLevel){
        if (currentLevel.size() < 1){
            return;
        }
        List<Integer> temp = new ArrayList<>();
        List<TreeNode> nextLevel = new ArrayList<>();
        for (TreeNode node:currentLevel){
            temp.add(node.val);
            // add left child and right child
            if (node.left != null){
                nextLevel.add(node.left);
            }
            if (node.right != null){
                nextLevel.add(node.right);
            }
        }
        ret.add(0, temp);
        dfs(nextLevel);
    }

测试代码

    public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(3, new TreeNode(9), new TreeNode(20, new TreeNode(15), new TreeNode(7)));
        new Number107().levelOrderBottom(treeNode);
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~