截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载

LeetCode 107. 二叉树的层序遍历 II_初始化
LeetCode 107. 二叉树的层序遍历 II_结点_02

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遍历,这题就很容易解决,虽然这题结果是从下往上,但我们只需要在每层节点值存储的时候修改一下位置即可。