剑指 Offer 32 - III. 从上到下打印二叉树 III

打印二叉树,层次遍历的变种,既然是层次遍历,就一定需要用到队列这种数据结构,而且由于要从左到右,从右到左,因此考虑用到标志位和双端队列。

单数行要从左到右打印,起始设置标志位为true,true代表从左到右打印。

而双数行要从右到左打印,所以我们在打印单数行的时候,就要将下一行的添加到队列中,假设我们在打印单数行的时候,对单数行节点的子节点是采用addLast的形式插入的,比如在第一行插入第二行的节点,那么插入完成时队列的数据为[ 9,20 ]

我们在第二行取得时候因为要取出20,所以标志位为false的时候,我们应该removeLast,取出20,而且要保证下一行是从左到右打印的,且我们是双数行,先插入20的右节点7,且此时队列中还有9这个节点,我们是用removeLast取出的,因此要保证9是当前最后一个节点,只能采用addFirst的方法,全部插入完成后,队列结构应该为,[ 15,7 ]

我们第三行还要从左到右打印,因此单数行取出的时候应该为removeFirst,代码如下

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> list = new ArrayList<>();
        if(root==null){
            return list;
        }
        Deque<TreeNode> queue = new LinkedList<>();
        TreeNode cur = root;
        queue.add(root);
        boolean flag = true;
        while(!queue.isEmpty()){ 
            List<Integer> temp = new ArrayList<Integer>();
            if(flag){
                for(int i = queue.size();i>0;i--){
                    TreeNode res = queue.removeFirst();
                    temp.add(res.val);
                    if(res.left!=null)
                        queue.addLast(res.left);
                    if(res.right!=null)
                        queue.addLast(res.right);
                }
            } else{
                for(int i = queue.size();i>0;i--){
                    TreeNode res = queue.removeLast();
                    temp.add(res.val);
                    if(res.right!=null)
                        queue.addFirst(res.right);
                    if(res.left!=null)
                        queue.addFirst(res.left);
                }
            }
            list.add(temp);
            flag = !flag;
        }
        return list;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值