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刷题100天—107. 二叉树的层序遍历 II(二叉树)—day08