import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.Queue; /** * 面試題61:按之字形順序打印二叉樹 * 請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其餘行以此類推。 */ public class _61_font { public static void main(String[] args) { TreeNode61 treeNode61 = new TreeNode61(1); treeNode61.left= new TreeNode61(2); treeNode61.right= new TreeNode61(3); treeNode61.left.left= new TreeNode61(4); Solution61 solution61 = new Solution61(); ArrayList<ArrayList<Integer>> print = solution61.Print(treeNode61); for(ArrayList<Integer> a:print){ for(Integer b:a){ System.out.print(b+"、"); } System.out.println(); } } } class Solution61 { public ArrayList<ArrayList<Integer>> Print(TreeNode61 pRoot) { ArrayList<ArrayList<Integer>> arrayList = new ArrayList<ArrayList<Integer>>(); if (pRoot == null) { return arrayList; } Queue<TreeNode61> queue=new LinkedList<TreeNode61>(); ArrayList<Integer> row=new ArrayList<Integer>(); queue.add(pRoot); boolean flag=false; while(!queue.isEmpty()){ row=new ArrayList<Integer>(); //每次從新生成一個對象 int len=queue.size(); row.clear(); for(int i=0;i<len;i++){ //遍歷一層節點 if(queue.peek().left!=null){ queue.add(queue.peek().left); } if(queue.peek().right!=null){ queue.add(queue.peek().right); } row.add(queue.poll().val); } if(flag){ Collections.reverse(row); flag=false; }else{ flag=true;; } arrayList.add(row); } return arrayList; } } class TreeNode61 { int val = 0; TreeNode61 left = null; TreeNode61 right = null; public TreeNode61(int val) { this.val = val; } }