您的位置:首页 > 其它

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

2017-05-15 16:00 369 查看
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;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: