71 - 二叉树的锯齿形层次遍历

5.15

也就是二叉树的层次遍历,只不过有的行需要正序,有的行需要反序。

犯了几个错误,需要再次注意。

1.

 LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
       
        while(!queue.isEmpty()){}

这里,在判断队列是不是为空的时候,我写的是 while(queue!= null),这个错误简直就是弱智啊。以至于一直运行时异常,找了半天错误,才反应过来。

2.

ArrayList<Integer> list = new ArrayList<Integer>();
list.clear();

这里,这个错误和上一个错误类似。在想置空list 的时候,我又写了 list = null。在判断是不是为空,以及置空的时候,要通过empty和clear函数,不可以再像我这样的想当然了,这种错误真的很低级。

3.

ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = new ArrayList<Integer>();
res.add(list);
list.clear();

这个错误,以前也犯过类似的。当list置空之后,res中的值也同样会置空,因为它们是指向同一块内存区域的。

即使新建一个ArrayList<Integer> tmp = list; res.add(tmp);也是行不通的。

需要重新创建一个与list内容相同的ArrayList才可以。

值得注意的地方,大概也就是这些。



AC代码为:

/**
 * 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<ArrayList<Integer>>();
        if(root == null){
            return res;
        }
        //用来存放每一层的值
        ArrayList<Integer> list = new ArrayList<Integer>();
        //用来表示这一行是正向遍历,还是反向遍历
        boolean tag = true;
        // 栈用来层次遍历树
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        // 用来指示每一层的最后一个节点
        TreeNode flag = root;
        TreeNode bt =  root;
        queue.addLast(bt);
        //这里犯了一个错误,刚开始写的是 while(queue != null)
        while(!queue.isEmpty()){
            bt = queue.pollFirst();
            //System.out.println("bt.val:" + bt.val + ";tag:" + tag);
            if(tag == true){
               list.add(bt.val);
               //System.out.println("list:" + list);
            }
            else if(tag == false){
                list.add(0,bt.val);
                //System.out.println("list:" + list);
            }
            if(bt.left != null){
                queue.addLast(bt.left);
                //System.out.println("左子树已加:" + bt.left.val);
            }
            if(bt.right != null){
                queue.addLast(bt.right);
                //System.out.println("右子树已加:" + bt.right.val);
            }
            if(bt == flag){
                tag = !tag;
                flag = queue.peekLast();
                ArrayList<Integer> tmp = new ArrayList<Integer>();
                Iterator ite = list.iterator();
                while(ite.hasNext()){
                    tmp.add((Integer)ite.next());
                }
                res.add(tmp);
                //System.out.println("从这里换行,此时的list为:" + list + "。此时的res为:"+ res);
                //list == null;
                list.clear();
            }
        }
        //System.out.println("res:" + res);
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值