1. 程式人生 > >按之字形順序列印二叉樹

按之字形順序列印二叉樹

題目

請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

思路

思路主要就是如何把層序遍歷序列按層分開來,跟前面的直接列印二叉樹每層思路一樣,只是現在要判斷奇數層和偶數層,然後反轉對應的ArrayList即可!

public class Solution {
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public
TreeNode(int val) { this.val = val; } } /** * 陣列轉二叉樹 */ private TreeNode createBinaryTreeByArray(int[] array, int index) { TreeNode tn = null; if (index < array.length) { int value = array[index]; tn = new TreeNode(value); tn.left = createBinaryTreeByArray(array, 2
* index + 1); tn.right = createBinaryTreeByArray(array, 2 * index + 2); return tn; } return tn; } /** * 之字形列印二叉樹 * 用reserve反轉,時間複雜度高 */ public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) { //arrayLists儲存結果 ArrayList<ArrayList<Integer>> arrayLists = new
ArrayList<>(); if (pRoot == null) { return arrayLists; } ArrayList<Integer> arrayList = new ArrayList<>(); //使用佇列,先進先出 Queue<TreeNode> queue = new LinkedList<>(); queue.add(pRoot); int start = 0; int end = 1; boolean leftToRight = true; while (!queue.isEmpty()) { TreeNode temp = queue.remove(); //新增到本行的arrayList arrayList.add(temp.val); start++; //每列印一個節點,就把此節點的下一層的左右節點加入佇列,並記錄下一層要列印的個數 if (temp.left != null) { queue.add(temp.left); } if (temp.right != null) { queue.add(temp.right); } if (start == end) { start = 0; end = queue.size(); if (leftToRight) { arrayLists.add(arrayList); } else { arrayLists.add(reverse(arrayList)); } //反轉過一次下次就不用反轉 leftToRight = !leftToRight; arrayList = new ArrayList<>(); } } return arrayLists; } /** * 反轉 */ private ArrayList<Integer> reverse(ArrayList<Integer> arrayList) { ArrayList<Integer> arrayList1 = new ArrayList<>(); for (int i = arrayList.size() - 1; i >= 0; i--) { arrayList1.add(arrayList.remove(i)); } return arrayList1; } }