請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。
boolean flag1 = true ; //利用標誌位來控制順序,為true,則從左到右的順序,為false則相反
Stack<TreeNode> s1 = new Stack<>();
Stack<TreeNode> s2 = new Stack<>(); //利用兩個棧的彈棧出棧,來模擬左右順序
ArrayList<ArrayList<Integer>> l1 = new ArrayList<>();
if(pRoot == null)
return l1;
s1.push(pRoot);
while((!s1.isEmpty()) || (!s2.isEmpty())) { //只要兩個棧都不為空,則繼續
TreeNode p1 = null;
if(flag1) {
p1 = s1.peek(); //當為true時,則p1位s1的棧頂元素
}else {
p1 = s2.peek(); //當為false時,則p1位s2的棧頂元素
}
if(flag1) {
ArrayList<Integer> al = new ArrayList<>(); //定義新的陣列儲存從s1中彈棧的元素
while(!s1.isEmpty()) {
p1 = s1.pop();
if(p1.left != null) //並且按照先左子樹,後右子樹的順序把從s1彈出的元素的左子樹和右子樹入棧s2
s2.push(p1.left);
if(p1.right != null)
s2.push(p1.right);
al.add(p1.val);
if(s1.isEmpty())
break;
p1 = s1.peek();
}
l1.add(al); //向陣列中新增此次遍歷的陣列
flag1 = false ; //更改標誌位
}else {
ArrayList<Integer> al1 = new ArrayList<>();
while(!s2.isEmpty()) {
p1 = s2.pop();
if(p1.right != null) //並且按照先右子樹,後左子樹的順序把從s2彈出的元素的左子樹和右子樹入棧s1
s1.push(p1.right);
if(p1.left != null)
s1.push(p1.left);
al1.add(p1.val);
if(s2.isEmpty())
break;
p1 = s2.peek();
}
l1.add(al1);
flag1 = true ;
}
}
/* for (TreeNode treeNode : al) {
l1.add(treeNode.val);
}
return l1;*/
return l1;