剑指Offer59:按之字形顺序打印二叉树(Java)
参考“牛客408964号”牛客解答:https://www.nowcoder.com/questionTerminal/91b69814117f4e8097390d107d2efbe0?f=discussion
思路分析:
利用栈先进后出的特性
偶数层 往栈以先右后左的顺序压入,当奇数层从栈中取值时得到的顺序时由左向右
奇数层 往栈以先左后右的顺序压入,当偶数层从栈中取值时得到的顺序时由右向左
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
Java代码:
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
Stack<TreeNode> s1=new Stack<>();
Stack<TreeNode> s2=new Stack<>();
ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
s1.push(pRoot);
int layer=1;
while(!s1.empty()||!s2.empty()){
if(layer%2!=0){//奇数层,从s1取值遍历,孩子节点按照先左后右的顺序压入s2
ArrayList<Integer> tmp=new ArrayList<Integer>();
while(!s1.empty()){//把一个栈遍历完了,也就是等同于遍历了一层二叉树
TreeNode node=s1.pop();
if(node!=null){
tmp.add(node.val);//需要判断node的空与否,否则会报空指针
s2.push(node.left);
s2.push(node.right);
}
}
if(!tmp.isEmpty()){//注意判空,当是时是tmp是空的,会被添加进最后结果集。
res.add(tmp);
layer++;
}
}else{//偶数层,从s2取值遍历,孩子节点按照先右后左的顺序压入s1
ArrayList<Integer> tmp=new ArrayList<Integer>();
while(!s2.empty()){
TreeNode node=s2.pop();
if(node!=null){
tmp.add(node.val);
s1.push(node.right);
s1.push(node.left);
}
}
if(!tmp.isEmpty()){
res.add(tmp);
layer++;
}
}
}
return res;
}
}