解法:遇到顺序问题,考虑使用使用双栈或队列。
今日感悟:花了2个小时半才完成,且代码和答案一致。看过思路但是还是花了这么长时间完成,最主要的原因还是对类的不熟悉,比如不知道 ArrayList的clear()、size()方法,将ArrayList=null,并不是清空它。判断ArrayList中是否为空时应用.size()==0判断。
step 1:首先判断二叉树是否为空,空树没有打印结果。
step 2:建立两个辅助栈,每次依次访问第一个栈s1与第二个栈s2,根节点先进入s1.
step 3:依据依次访问的次序,s1必定记录的是奇数层,访问节点后,将它的子节点(如果有)依据先左后右的顺序加入s2,这样s2在访问的时候根据栈的先进后出原理就是右节点先访问,正好是偶数层需要的从右到左访问次序。偶数层则正好相反,要将子节点(如果有)依据先右后左的顺序加入s1,这样在s1访问的时候根据栈的先进后出原理就是左节点先访问,正好是奇数层需要的从左到右访问次序。
step 4:每次访问完一层,即一个栈为空,则将一维数组加入二维数组中,并清空以便下一层用来记录。
思路代码:
while(!stack1.isEmpty()){//第一层
tree=stack1.pop();
temp.add(tree.val);
if(tree.left!=null)stack2.push(tree.left);
if(tree.right!=null)stack2.push(tree.right);
}
while(!stack2.isEmpty()){ //第二层
tree=stack2.pop();
temp.add(tree.val);
if(tree.right!=null)stack1.push(tree.right);
if(tree.left!=null)stack1.push(tree.left);
}
第一次解代码:与正确代码相比,思路正确,但是细节理解不够,
import java.util.*;
import java.util.ArrayList;
/*
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>> angswer= new ArrayList<>();
if(pRoot==null)return null;
Stack<TreeNode> stack1=new Stack<>();
Stack<TreeNode> stack2=new Stack<>();
stack1.push(pRoot);
TreeNode tree=null;
ArrayList<Integer> temp = new ArrayList<Integer>();
while(!stack1.isEmpty()||!stack2.isEmpty()){
while(!stack1.isEmpty()){
tree=stack1.pop();
temp.add(tree.val);
if(tree.left!=null)stack2.push(tree.left);
if(tree.right!=null)stack2.push(tree.right);
}
angswer.add(temp);
temp=null;
while(!stack2.isEmpty()){
tree=stack2.pop();
temp.add(tree.val);
if(tree.right!=null)stack1.push(tree.right);
if(tree.left!=null)stack1.push(tree.left);
}
angswer.add(temp);
temp=null;
}
return angswer;
}
}
#第二次解的代码:当pRoot==null时应该返回[]数组而不是null
import java.util.*;
import java.util.ArrayList;
/*
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>> angswer= new ArrayList<>();
if(pRoot==null)return null;
Stack<TreeNode> stack1=new Stack<>();
Stack<TreeNode> stack2=new Stack<>();
stack1.push(pRoot);
TreeNode tree=null;
ArrayList<Integer> temp = new ArrayList<Integer>();
while(!stack1.isEmpty()||!stack2.isEmpty()){
while(!stack1.isEmpty()){
tree=stack1.pop();
temp.add(tree.val);
if(tree.left!=null)stack2.push(tree.left);
if(tree.right!=null)stack2.push(tree.right);
}
if(temp.size()!=0)angswer.add(new ArrayList<Integer>(temp));
temp.clear();
while(!stack2.isEmpty()){
tree=stack2.pop();
temp.add(tree.val);
if(tree.right!=null)stack1.push(tree.right);
if(tree.left!=null)stack1.push(tree.left);
}
if(temp.size()!=0)angswer.add(new ArrayList<Integer>(temp));
temp.clear();
}
return angswer;
}
}
最终正确的代码: