「这是我参与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
- 遍历第一层:此时
currentLevel = [3]
,将遍历到的结果[3]
加入结果集ret
的头部。再将根节点的左右孩子放到下一层节点中,nextLevel = [9, 20]
- 遍历第二层:此时
currentLevel = [9, 20]
,将遍历到的结果[9, 20]
加入结果集ret
的头部,结果集此时为[[9, 20], [3]]
。再将各节点不为空的左右孩子放到下一层节点中,nextLevel = [15, 7]
- 遍历第三层:此时
currentLevel = [15, 7]
,将遍历到的结果[15, 7]
加入结果集ret
的头部,结果集此时为[[15, 7], [9, 20], [3]]
。因各节点都没有孩子了,故结束遍历 - 返回结果集
[[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);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~