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;
}
}