题目:实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印
分析:利用两个栈来保存数据,打印某一行结点时,把下一层的子结点保存到相应的栈里,如果当前打印的是奇数层,先保存左子结点再保存右子结点;如果当前打印的是偶数层,先保存右结点,再保存左结点
代码:参考牛客大神,比较好理解
import java.util.*;
public class wr61printZhi {
public static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot){
ArrayList<ArrayList<Integer>> listall=new ArrayList<>();
int layer=1;//奇数偶数层记录
// s1存储奇数层结点,先保存左子结点,再右子结点
Stack<TreeNode> s1=new Stack<TreeNode>();
// s2存储偶数层结点,先保存右子结点,再左子结点
Stack<TreeNode> s2=new Stack<TreeNode>();
// ArrayList<Integer> list=new ArrayList<>();
s1.push(pRoot);
while(!s1.isEmpty() || !s2.isEmpty()){
if(layer%2!=0){//奇数层
ArrayList<Integer> list=new ArrayList<>();
while(!s1.isEmpty()){
TreeNode temp=s1.pop();
if(temp!=null){
list.add(temp.val);
if(temp.left!=null){
s2.push(temp.left);
}
if(temp.right!=null){
s2.push(temp.right);
}
}
}
if(!list.isEmpty()){
listall.add(list);
layer++;
}
}
else{//偶数层
ArrayList<Integer> list=new ArrayList<>();
while(!s2.isEmpty()){
TreeNode temp=s2.pop();
if(temp!=null){
list.add(temp.val);
if(temp.right!=null){
s1.push(temp.right);
}
if(temp.left!=null){
s1.push(temp.left);
}
}
}
if(!list.isEmpty()){
listall.add(list);
layer++;
}
}
}
return listall;
}
public static void main(String []args){
TreeNode root=new TreeNode(1);
root.left=new TreeNode(2);
root.right=new TreeNode(3);
root.left.left=new TreeNode(4);
root.left.right=new TreeNode(5);
root.right.left=new TreeNode(6);
root.right.right=new TreeNode(7);
ArrayList<ArrayList<Integer> > listall=Print(root);
for(int i=0;i<listall.size();i++){
System.out.println(listall.get(i));
}
}
}