携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
一、题目描述:
给你二叉树的根节点 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
来源:力扣(LeetCode) 链接:leetcode.cn/problems/bi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
结果需要自底向上,直接自底向上显然不好实现,所以可以采用自顶向下层次遍历,然后再反转即可得到。 如果用一个队列进行层次遍历,会有一个麻烦,就是不知道每一层什么时候结束,就没办法将每一层的数据分别用不同集合来存储。 所以可以采用两个队列来实现,一个队列遍历当前层,一个队列存储下一层,交替使用,达到目的。
三、AC 代码:
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
//解题思路:DFS遍历,注意结果采用头插法
List<List<Integer>> result = new ArrayList();
dfs(result, root, 0);
return result;
}
private void dfs(List<List<Integer>> result, TreeNode root, int level){
if(root == null){
return;
}
//初始化新的层在第一行
if(level == result.size()){
result.add(0, new ArrayList());
}
//写入结果集;第level层要插入从后往前数的第level层
result.get(result.size() - level - 1).add(root.val);
//左子树
dfs(result, root.left, level + 1);
//右子树
dfs(result, root.right, level + 1);
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助
期待下次再见~
🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注Jam,从你我做起!