059按之字形顺序打印二叉树
题目:
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
方法:双栈分别存奇偶层
思路:新建两个栈分别来存放奇偶层的二叉树节点,用一个变量%2为0还是1控制奇偶,奇数每个节点出来就遍历,然后把左右子树存到偶数栈里,遍历完后,把变量++,去遍历偶数栈,
代码:
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
int num=1;
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
Stack<TreeNode> stack1 = new Stack<>();//存奇数层
stack1.push(pRoot);
Stack<TreeNode> stack2 = new Stack<>();//存偶数层
while(!stack1.empty()||!stack2.empty()){
if(num%2==1){//奇数
ArrayList<Integer> temp = new ArrayList<>();
while(!stack1.empty()){
TreeNode node=stack1.pop();
if(node!=null){//
temp.add(node.val);
System.out.print(node.val+" ");
stack2.push(node.left);
stack2.push(node.right);
}
}
if(!temp.isEmpty()){
list.add(temp);
num++;
System.out.println();
}
}
if(num%2==0){
ArrayList<Integer> temp = new ArrayList<>();
while(!stack2.empty()){
TreeNode node=stack2.pop();
if(node!=null){
temp.add(node.val);
System.out.print(node.val+" ");
stack1.push(node.right);
stack1.push(node.left);
}
}
if(!temp.isEmpty()){
list.add(temp);
num++;
System.out.println();
}
}
}
return list;
}