107. 二叉树的层序遍历 II
给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层序遍历为:
[
[15,7],
[9,20],
[3]
]
/**
* 说明:二叉树类如下
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
来源:力扣
解题思路一
* 1、从上至下,从左至右 递归遍历二叉树,因为是二叉树,递归时注意左右同时递归
* 2、用map,层级做key,同一层级的放在一个集合里面
* 3、倒叙遍历得到的结果,返回集合
/**
* 1、从上至下,从左至右 递归遍历二叉树
* 2、同一层级的放在一个集合里面
* 3、倒叙遍历得到的结果,返回集合
* @param root
* @return
*/
public List<List<Integer>> levelOrderBottom(TreeNode root) {
//MAP存放每层级的数集合,也可用数组
HashMap<Integer,List<Integer>> resMap = new HashMap<>();
//层级初始化
int level = 0;
//二叉树遍历
preNode(root,level,resMap);
List<List<Integer>> res = new ArrayList<>();
//倒叙遍历MAP
for(int i=resMap.size()-1;i>=0;i--){
res.add(resMap.get(i));
}
return res;
}
/**
* 二叉树递归遍历
* @param root 二叉树
* @param level 层级
* @param map map收集集合数据
*/
public void preNode(TreeNode root,int level,HashMap<Integer,List<Integer>> map) {
if(root!=null){
if(map.get(level) == null){
map.put(level,new ArrayList<>());
}
//同一层级的放一起,后面倒叙取出
map.get(level).add(root.val);
//层级增加
level ++;
//同时递归左右,所以level一样
preNode(root.left,level,map);
preNode(root.right,level,map);
//若三叉树,则同时递归3个
}
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}