题目:二叉树的层次遍历 II


给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历)

您在真实的面试中是否遇到过这个题?

Yes





样例

给出一棵二叉树 {3,9,20,#,#,15,7},
    3
   / \
  9  20
    /  \
   15   7

按照从下往上的层次遍历为:
[
  [15,7],
  [9,20],
  [3]
]
标签 Expand   


解题思路:
和二叉树的层次遍历一致,
我们可以设置两个队列,想象一下队列的特点,就是先进先出,首先把第0层保存在一个队列中,然后按节点访问,并把已经访问节点的左右孩子节点放在第二个队列中,当第一个队列中的所有节点都访问完成之后,交换两个节点。这样重复下去,知道所有层的节点都被访问,这样做的代价就是空间复杂度有点高 只需将最后的List反转即可
/**
* Definition of TreeNode:
* public class TreeNode {
*     public int val;
*     public TreeNode left, right;
*     public TreeNode(int val) {
*         this.val = val;
*         this.left = this.right = null;
*     }
* }
*/


public class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: buttom-up level order a list of lists of integer
     */
    public ArrayList<ArrayList<Integer>> levelOrderBottom(TreeNode root) {
        // write your code here
         ArrayList<ArrayList<Integer>> res  = new ArrayList<>();
          if(null==root) return res;
          Queue<TreeNode> fQ = new LinkedList<>();
          fQ.add(root);
          while(fQ!=null&&fQ.size()>0){
              Queue<TreeNode> sQ = new LinkedList<>();
             ArrayList<Integer> depthRoot  = new ArrayList<>();
              while(fQ!=null&&fQ.size()>0){
                   TreeNode  cur = fQ.poll();
                   depthRoot.add(cur.val);
                   if(cur.left!=null){
                        sQ.add(cur.left);
                   }
                   if(cur.right!=null){
                        sQ.add(cur.right);
                   }
              }
              res.add(depthRoot);
              fQ = sQ;
          }         
          return reverse(res);        
     }
     public ArrayList<ArrayList<Integer>>  reverse(ArrayList<ArrayList<Integer>> res){
         ArrayList<ArrayList<Integer>>  reres = new ArrayList<>();
         for(int i=res.size()-1;i>=0;i--){
              ArrayList<Integer> tmp = res.get(i);
              reres.add(tmp);
         }
         return reres;
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值