Binary Tree Level Order Traversal II I

每日一题;

昨天有事儿,没做今天补上。

这两道题是一样的,都是把二叉树广搜,输出每层节点,一个是从下往上,一个是从上往下;

我的思路是:

1、建立一个队列(参考别人后想到的),然后把根节点放进去,

2、依次处理队列中的值,如果有左右孩子,就把左右孩子分别加到队列里面,然后把值放进当前层的列表里面;

3、在层与层之间分割的地方集,在队列中加入一个空节点,遇到空节点时,就把当前列表放进结果列表,然后在队列里面加入层分割;

4、在加入结果队列的时候,过滤一下,如果当前层列表是空的就不要加入结果队列了。

5、从上向下和从下向上只需要把当前层加入结果队列时,指定加入的index就可以了。


Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).

For example:
Given binary tree {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

return its bottom-up level order traversal as:

[
  [15,7],
  [9,20],
  [3]
]


public static List<List<Integer>> levelOrderTop(TreeNode root) {
        if(root==null) new ArrayList<List<Integer>>();
        List<List<Integer>> result=new ArrayList<List<Integer>>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        TreeNode temp ;
        ArrayList<Integer> list = new ArrayList<Integer>();
        queue.offer(root);
        queue.offer(null);
        while (queue.size()>0){
            temp = queue.poll();
            if(temp == null){
                if(!list.isEmpty()){
                    queue.offer(null);
                    result.add(list);
                    list = new ArrayList<Integer>();
                }
            }else {
                if(temp.left!=null)
                    queue.offer(temp.left);
                if(temp.right!=null)
                    queue.offer(temp.right);
                list.add(temp.val);
            }
        }

        return result;
    }

    public static List<List<Integer>> levelOrderBottom(TreeNode root) {
        if(root==null) new ArrayList<List<Integer>>();
        List<List<Integer>> result=new ArrayList<List<Integer>>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        TreeNode temp ;
        ArrayList<Integer> list = new ArrayList<Integer>();
        queue.offer(root);
        queue.offer(null);
        while (queue.size()>0){
            temp = queue.poll();
            if(temp == null){
                if(!list.isEmpty()){
                    queue.offer(null);
                    result.add(0,list);
                    list = new ArrayList<Integer>();
                }
            }else {
                if(temp.left!=null)
                    queue.offer(temp.left);
                if(temp.right!=null)
                    queue.offer(temp.right);
                list.add(temp.val);
            }
        }

        return result;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值