利用双栈实现“之”打印
按之字形顺序打印二叉树
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; }