请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解析:用两个栈,栈是先进后出,详细解析在代码中
代码:
import java.util.ArrayList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
//按照惯例首先写一个保存结果的链表
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
//然后做最简单的判断
if(pRoot == null){
return res;
}
//下面才开始做题
//首先记录一下行数,奇数行从左到右,偶数行从右到左
int count = 1;
//存放奇数层
Stack<TreeNode> oddStack = new Stack<>();
oddStack.push(pRoot);
//存放偶数层
Stack<TreeNode> evenStack = new Stack<>();
while(!oddStack.isEmpty() || !evenStack.isEmpty()){
//奇数层
if(count % 2 == 1){
ArrayList<Integer> list = new ArrayList<>();
while(!oddStack.isEmpty()){
TreeNode temp = oddStack.pop();
if(temp != null){
list.add(temp.val);
//偶数行打印从右到左;存储需要从左到右
evenStack.push(temp.left);
evenStack.push(temp.right);
}
}
if(list.size() != 0){
res.add(list);
count++;
}
}else{
ArrayList<Integer> list = new ArrayList<>();
while(!evenStack.isEmpty()){
TreeNode temp = evenStack.pop();
if(temp != null){
list.add(temp.val);
//奇数行打印从左到右,存储需要从右到左
oddStack.push(temp.right);
oddStack.push(temp.left);
}
}
if(list.size() != 0){
res.add(list);
count++;
}
}
}
return res;
}
}