力扣 剑指Offer32-III 从上到下打印二叉树(java)

在这里插入图片描述

   通过题目我们可以知道第一层是正着存,第二层是反着存,第三层又是正着存……所以我们可以发现奇数层都是争着存,偶数层都是反着存。然后问题就是要判断当前遍历的是奇数层还是偶数层。最后返回的是List<List< Integer>>集合,这个最外面list其实就是存放的就是每一层,它的size就表示的是到达了第几层,所以我们可以通过它的size的奇偶来判断是奇数层还是偶数层.
我们可以定义一个LinkedLIst,就拿样例来说,第二层是偶数层,打印的应该是[20,9],所以我们应该是将9,20依次从链表头部放进去。然后第三层是奇数层,应该打印[15,7],所以我们就从链表的尾部放进去。

class Solution {
    
    
    public List<List<Integer>> levelOrder(TreeNode root) {
    
    
    	//存结点的
        Queue<TreeNode> queue = new LinkedList<>();
        //存每一层
        List<List<Integer>> res = new ArrayList<>();
        if(root != null) queue.add(root);
        while(!queue.isEmpty()) {
    
    
            LinkedList<Integer> tmp = new LinkedList<>();
            //n来判断是奇数层还是偶数层
            int n=queue.size();
            for(int i =0; i<n ; i++) {
    
    
                TreeNode node = queue.poll();
                //偶数层,从头放
                if(res.size() % 2 == 0) tmp.addLast(node.val);
                //奇数层,从尾放 
                else tmp.addFirst(node.val); 
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }
            res.add(tmp);
        }
        return res;
    }
}

在队列中的放还是按照正常的先左后右,但是它的poll的值就要进到linkedlist里面,这个时候是从头放还是从尾放就要讨论了。

猜你喜欢

转载自blog.csdn.net/weixin_51656756/article/details/121625792