题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
第一行,按顺序打印;第二行,先放入一个栈中,然后取出再打印;第三行按顺序打印,如此继续;需要一个标记来判断是不是使用栈来存储(为了反序)。基础是按层遍历,使用last和nlast来判断是不是要换行了。
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> arrayList = new ArrayList();
if(pRoot == null)
return arrayList;
Queue<TreeNode> queue = new LinkedList();
ArrayList<Integer> list = new ArrayList();
Stack<TreeNode> stack = new Stack();
TreeNode last = pRoot;
TreeNode nlast = null;
boolean isStack = false;
queue.offer(pRoot);
while(!queue.isEmpty()){
TreeNode cur = queue.poll();
if(cur.left != null){
queue.offer(cur.left);
nlast = cur.left;
}
if(cur.right != null){
queue.offer(cur.right);
nlast = cur.right;
}
if(!isStack)//无论当前是不是当前行的最后一个,都得存入
list.add(cur.val);
else
stack.push(cur);
if(cur == last){
if(!isStack){
arrayList.add(list);
list = new ArrayList();
isStack = true;
}else{
while(!stack.isEmpty()){
TreeNode t = stack.pop();
list.add(t.val);
}
arrayList.add(list);
list = new ArrayList();
isStack = false;
}
last = nlast;
}
}
return arrayList;
}
}
小错误:
(1)栈不为null
(2)就算last == cur的时候,也得add操作
(3)last的变换
(4)有点存储的是节点,有的是val