利用双栈实现“之”打印
按之字形顺序打印二叉树
http://www.nowcoder.com/questionTerminal/91b69814117f4e8097390d107d2efbe0
主要思想:在栈1出栈的过程同时按照特定顺序将栈1中的节点的左右孩子压入栈2,当栈1出栈完毕即某一行扫描完毕,同时还将下一行数据压入了栈2,然后继续重复上述过程即可
注意:唯一要注意的是从栈1到栈2压入顺序和从栈2到栈1压入顺序是相反的,为了保证之字形
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > res = new ArrayList<>();
ArrayList<Integer> item = new ArrayList<>();
if(pRoot==null) return res;
Deque<TreeNode> s1 = new LinkedList<>();
Deque<TreeNode> s2 = new LinkedList<>();
s1.push(pRoot);
while(true){
if(s1.isEmpty() && s2.isEmpty()) break;
if(!s1.isEmpty()){//如果s1不为null,则s1出栈的同时将其左右节点先后入s2
while(!s1.isEmpty()){
TreeNode temp = s1.poll();
item.add(temp.val);
if(temp.left!=null) s2.push(temp.left);
if(temp.right!=null) s2.push(temp.right);
}
res.add(new ArrayList(item));//s1出栈完毕即这一行都打印完成
item.clear();
}else{
while(!s2.isEmpty()){//如果s2不为null,则s2出栈的同时将其右左节点先后入s1
TreeNode temp = s2.poll();
item.add(temp.val);
if(temp.right!=null) s1.push(temp.right);
if(temp.left!=null) s1.push(temp.left);
}
res.add(new ArrayList(item));//s2出栈完毕即这一行都打印完成
item.clear();
}
}
return res;
}

