【做题笔记】107. 二叉树的层序遍历 II

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;
        }
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值