一起养成写作习惯!这是我参与「掘金日新计划 · 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),需要一个集合存储遍历结果,一个队列辅助遍历。