• leetcode 103 Binary Tree Zigzag Level Order Traversal ----- java


    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

    For example:
    Given binary tree [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7
    

    return its zigzag level order traversal as:

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

    和上一题很类似,只不过输出的时候,需要“之”字形输出。

    可以在上一层答案的基础上。对偶数层进行反转。

    第一次用了两个队列,实现了,但比较慢。

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        
        
        List list = new ArrayList<List<Integer>>();
        if( root == null)
            return list;
        Deque<TreeNode> queue = new LinkedList<TreeNode>();
        Deque<TreeNode> queue1 = new LinkedList<TreeNode>();
        queue.add(root);
        int dir = 0;
        while( !queue.isEmpty() ){
            List ans = new ArrayList<Integer>();
            int size = queue.size();
            for( int i = 0;i<size;i++){
                TreeNode node = null;
                if( dir == 0)
                    node = queue.poll();
                else
                    node = queue.pollLast();
                ans.add(node.val);
                if( dir == 0){
                    if( node.left != null)
                        queue1.add(node.left);
                    if( node.right != null)
                           queue1.add(node.right);
                }else{
                    if( node.right != null)
                        queue1.addFirst(node.right);
                    if( node.left != null)
                        queue1.addFirst(node.left);
                }
            }
            list.add(ans);
            queue.addAll(queue1);
            queue1.clear();
            dir = (dir == 1?0:1);
        }
    
        return list;
    
    
    
    }
    }

    但是优点在于不用递归和回溯

    使用递归/回溯,速度和代码都会得到优化。

    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        helper(res, root, 1);
        for (int i = 0; i < res.size(); i++)
            if (i % 2 == 1)
                Collections.reverse(res.get(i));
        return res;
    }
    private void helper(List<List<Integer>> res, TreeNode node, int level){
        if (node == null) return;
        if (res.size() < level) res.add(new ArrayList<Integer>());
        res.get(level-1).add(node.val);
        helper(res, node.left, level+1);
        helper(res, node.right, level+1);
    }
  • 相关阅读:
    python三级菜单
    python购物车
    crontab计划任务
    shell脚本相关关系、浮点、循环
    find及其他命令
    awk命令
    sed命令
    linux正则表达式
    shell脚本编写nginx部署脚本
    shell脚本编写监控内存并发送邮件
  • 原文地址:https://www.cnblogs.com/xiaoba1203/p/5999525.html
Copyright © 2020-2023  润新知