題目:
請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。
知識點:
二叉樹
思路:
例如:,輸出結果是[[8],[10,6],[5,7,9,11]]
將每層的結點存入Stack中,爲下一層結點的訪問做準備,下一層節點的根節點爲存儲着上一層節點的棧的棧頂。
答案:
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<Integer> al = new ArrayList<Integer>();
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
if(pRoot==null){return list;}
Stack<TreeNode> s1 = new Stack<TreeNode>();//從右向左打印的棧
Stack<TreeNode> s2 = new Stack<TreeNode>();//從左向右打印的棧
s1.push(pRoot);//初始節點
al.add(pRoot.val);
list.add(al);
while(!s1.isEmpty()||!s2.isEmpty()){//只要兩個棧都不爲空
s2 = rToL(list,s1);//將結果棧傳遞給從左向右的函數
s1 = lToR(list,s2);//將結果棧傳遞給從右向左的函數
}
return list;
}
public Stack<TreeNode> rToL(ArrayList<ArrayList<Integer>> list,Stack<TreeNode> s1){
ArrayList<Integer> al = new ArrayList<Integer>();
Stack<TreeNode> sTmp = new Stack<TreeNode>();
if(s1.isEmpty()){return sTmp;}
TreeNode tmp = null;
while(!s1.isEmpty()){
tmp = s1.pop();
if(tmp.right!=null){
sTmp.push(tmp.right);
al.add(tmp.right.val);
}
if(tmp.left!=null){
sTmp.push(tmp.left);
al.add(tmp.left.val);
}
}
if(!al.isEmpty()) {list.add(al);}
return sTmp;
}
public Stack<TreeNode> lToR(ArrayList<ArrayList<Integer>> list,Stack<TreeNode> s2){
ArrayList<Integer> al = new ArrayList<Integer>();
Stack<TreeNode> sTmp = new Stack<TreeNode>();
if(s2.isEmpty()){return sTmp;}
TreeNode tmp = null;
while(!s2.isEmpty()){
tmp = s2.pop();
if(tmp.left!=null){
sTmp.push(tmp.left);
al.add(tmp.left.val);
}
if(tmp.right!=null){
sTmp.push(tmp.right);
al.add(tmp.right.val);
}
}
if(!al.isEmpty()) {list.add(al);}
return sTmp;
}
}