問題
請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,
第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。
算法
在層序遍歷的基礎上進行改進
分析
代碼
package ATree;
import java.util.*;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/3/13 0013 17:54
* 請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,
* 第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。
*/
public class Problem4 {
//層序遍歷
public void level(TreeNode pRoot){
Queue<TreeNode> queue = new ArrayDeque<>();
//先實現層序遍歷
TreeNode temp = pRoot;
queue.add(temp);
while(queue.size()!=0){
temp = queue.poll();
if(temp.left!=null){
queue.add(temp.left);
}
if(temp.right!=null){
queue.add(temp.right);
}
System.out.println(temp.val);
}
}
//Z子姓打印
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
//true表示奇數層,false表示偶數層
boolean flag = true;
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(pRoot);
while(queue.size()!=0){
//計算此時隊列的長度以此計算需要取出的數據個數
int len = queue.size();
ArrayList<Integer> arrayList =new ArrayList<>();
TreeNode treeNode = null;
for(int i=0;i<len;i++){
treeNode = queue.poll();
if(treeNode.left!=null){
queue.add(treeNode.left);
}
if(treeNode.right!=null){
queue.add(treeNode.right);
}
arrayList.add(treeNode.val);
}
if(!flag){//反序取數據
Collections.reverse(arrayList);
}
//更換奇偶層標誌
flag = !flag;
result.add(arrayList);
}
return result;
}
public static void main(String[] args) {
TreeNode A = new TreeNode(1);
TreeNode B = new TreeNode(2);
TreeNode C = new TreeNode(3);
TreeNode D = new TreeNode(4);
TreeNode E = new TreeNode(5);
TreeNode G = new TreeNode(6);
TreeNode H = new TreeNode(7);
TreeNode I = new TreeNode(8);
A.left=B;
A.right=C;
B.left=D;
C.left=E;
C.right=G;
D.right=H;
G.left=I;
Problem4 problem4 = new Problem4();
// problem4.Print(A);
ArrayList<ArrayList<Integer>> result = problem4.Print(A);
for(ArrayList<Integer> t:result){
for(Integer re:t){
System.out.print(re+" ");
}
System.out.println(" ");
}
}
}