leedcode做题总结,题目Binary Tree Zigzag Level Order Traversal 2012/09/28

最近做了不少二叉树的题,所以这道题两遍过了,第一遍是特别傻逼的忘记对root判空了,一定要注意。

方法是层序历遍,然后用tmp来标记行,用add()和addFirst()来实现LIST的不同方向插入


public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        LinkedList<List<Integer>> a1 = new LinkedList<List<Integer>>();
        LinkedList<Integer> a2 = new LinkedList<Integer>();
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        int i=0,j=0;
        int tmp=0;

        if(root==null) return a1;
        q.offer(root);
        j++;
        while (!q.isEmpty()){
            TreeNode t = q.poll();
            j--;
            if(t.left!=null){
                q.offer(t.left);
                i++;
            }
            if(t.right!=null){
                q.offer(t.right);
                i++;
            }
            if(tmp==0){
                a2.add(t.val);
                if(j==0){
                    j=i;
                    i=0;
                    a1.add(a2);
                    a2 = new LinkedList<Integer>();
                    tmp=1;
                }
            }else{
                a2.addFirst(t.val);
                if(j==0){
                    j=i;
                    i=0;
                    a1.add(a2);
                    a2 = new LinkedList<Integer>();
                    tmp=0;
                }
            }
        }
        return a1;


    }


Update 2015/08/18: 相较于上一个历遍题,只需要增加一个变量flag记录层数,奇数层正序,偶数层逆序即可


/**
 * 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: A list of lists of integer include 
     *          the zigzag level order traversal of its nodes' values 
     */
    public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
        // write your code here
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        Queue<TreeNode> q = new LinkedList<>();
        if (root == null)
            return res;
        int current = 1;
        int next = 0;
        int flag = 1;
        ArrayList<Integer> in = new ArrayList<>();
        while (root != null){
            if (flag % 2 == 1)
                in.add(root.val);
            else
                in.add(0, root.val);
            if (root.left != null){
                q.add(root.left);
                next++;
            }
            if (root.right != null){
                q.add(root.right);
                next++;
            }
            if (q.size() != 0){
                root = q.poll();
                current--;
                if (current == 0){
                    res.add(in);
                    in = new ArrayList<Integer>();
                    current = next;
                    next = 0;
                    flag++;
                }
            } else {
                res.add(in);
                break;
            }
        }
        return res;
    }
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值