二叉树的层序遍历 II

102 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

一、题目

leetcode 二叉树的层序遍历 II

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

示例 1:

输入: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

二、题解

方法一

首先需要按层遍历返回节点值就可以使用BFS广度优先搜索,按照根节点开始,往下层层获取子树,然后按层将每一层的节节点值依次从左到右添加到结果集中,同时因为需要返回的结果是要自底向上的层序遍历,其实我们也不用非得从底向上来遍历,直接从上至下、从左至右来遍历,然后把遍历的结果反过来就行了。具体的我们可以将第一层遍历的结果从队列头部放入,将第二层遍历的结果从头部追加到队列,依次最后从头部读取的结果就是自底向上的层序遍历了。具体的遍历中同样需要一个队列queue辅助,首先就将root树放入队列,然后遍历取出队列元素节点,再定义一个level集合存储当前层遍历的结果,然后再用size记录下当前层的节点数,表示往队列尾部取出的size个元素就是当前层的元素。如果取出的当前节点元素不为空就将该节点值添加到level层集合,同样的也需要将节点的子树也从尾部添加到队列中。最后获取完当前层节点时判断,如果level层集合不为空就从头部添加到result最终结果集里面,最后返回result即可。

三、代码

方法一 Java代码

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> result = new LinkedList<List<Integer>>();
        if (root != null) {
            Queue<TreeNode> queue = new LinkedList<TreeNode>();
            queue.add(root);
            while (!queue.isEmpty()) {
                List<Integer> level = new ArrayList<Integer>();
                int size = queue.size();
                for (int i = 0; i < size; i++) {
                    TreeNode node = queue.poll();
                    if (node == null) {
                        continue;
                    }
                    level.add(node.val);
                    queue.offer(node.left);
                    queue.offer(node.right);
                }
                if (level.size() > 0) {
                    result.add(0, level);
                }
            }
        }
        return result;
    }
}

时间复杂度:O(n),需要遍历一次树的所有节点。

空间复杂度:O(n),需要一个集合存储遍历结果,一个队列辅助遍历。