定义两个栈stk1和stk2。先讲根结点push到stk1中,然后做循环while,当stk1不为空,从stk1中pop结点并将结点左孩子和有孩子依次push到stk2中。然后另一个while做循环,stk2不为空,从stk2中pop出结点并将结点到右孩子和左孩子依次放入栈中。大循环终止条件是stk1和stk2都为空。
心得:一般要改变顺序的题,基本都要考虑一下栈。
import java.util.ArrayList;
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> lst=new ArrayList<>();
if(pRoot==null){
return lst;
}
Stack<TreeNode> stk1=new Stack<>();
Stack<TreeNode> stk2=new Stack<>();
stk1.push(pRoot);
while(!stk1.isEmpty()||!stk2.isEmpty()){
ArrayList<Integer> list=new ArrayList<>();
while(!stk1.isEmpty()){
TreeNode t=stk1.pop();
list.add(t.val);
if(t.left!=null){
stk2.push(t.left);
}
if(t.right!=null){
stk2.push(t.right);
}
}
if(!list.isEmpty())
lst.add(list);
ArrayList<Integer> list2=new ArrayList<>();
while(!stk2.isEmpty()){
TreeNode temp=stk2.pop();
list2.add(temp.val);
if(temp.right!=null){
stk1.push(temp.right);
}
if(temp.left!=null){
stk1.push(temp.left);
}
}
if(!list2.isEmpty())
lst.add(list2);
}
return lst;
}
}