题目
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。
上图按之字形打印的结果为:
1
3 2
4 5 6 7
15 14 13 12 11 10 9 8
解题思路
按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前打印的是偶数层,则先保存右子结点再保存左子结点到第二个栈里。
public static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > al=new ArrayList<ArrayList<Integer> > ();
if(pRoot==null){
return al;
}
Stack<TreeNode> dan=new Stack<TreeNode>();
Stack <TreeNode> shuang=new Stack<TreeNode>();
dan.push(pRoot);
while(dan.size()!=0||shuang.size()!=0){
ArrayList<Integer> te=new ArrayList<Integer>();
if(dan.size()!=0){
while(dan.size()!=0){
TreeNode tn=dan.pop();
te.add(tn.val);
if(tn.left!=null)shuang.push(tn.left);
if(tn.right!=null)shuang.push(tn.right);
}
}else if(shuang.size()!=0){
while(shuang.size()!=0){
TreeNode tn=shuang.pop();
te.add(tn.val);
if(tn.right!=null)dan.push(tn.right);
if(tn.left!=null)dan.push(tn.left);
}
}
al.add(te);
}
return al;
}