/** 請實現一個函數按照之字形打印二叉樹, 即第一行按照從左到右的順序打印, 第二層按照從右至左的順序打印, 第三行按照從左到右的順序打印, 其餘行以此類推。 */
/*思路:利用Java中的LinkedList的底層實現是雙向鏈表的特色。 1)可用作隊列,實現樹的層次遍歷 2)可雙向遍歷,奇數層時從前向後遍歷,偶數層時從後向前遍歷 */
import java.util.*; public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { return levelorder(pRoot); } public static ArrayList<ArrayList<Integer>> levelorder(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); ArrayList<ArrayList<Integer>> result = new ArrayList<>(); if(root == null) return result; queue.offer(root); // 首先將根節點root入隊 int level = 0;//記錄層數 while (!queue.isEmpty()) {// Queue不爲空則循環 LinkedList<Integer> node = new LinkedList<>();// 保存每一層節點的值 int length = queue.size();// 每一層的節點數目 while (length > 0) { TreeNode tree = queue.poll(); if (tree.left != null) { queue.offer(tree.left); } if (tree.right != null) { queue.offer(tree.right); } if((level+1)%2==0){ node.addFirst(tree.val); }else{ node.add(tree.val); } length--; } // node爲本層遍歷結果 // 將linkedlist轉成 ArrayList ArrayList<Integer> arrayNode = new ArrayList<>(); for (Integer i: node) { arrayNode.add(i); } result.add(arrayNode); //循環結束後,獲得的Queue爲下一層作準備, level++; } return result; } }