1. 程式人生 > >《劍指offer》——把二叉樹列印成多行

《劍指offer》——把二叉樹列印成多行

T:

題目描述
從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。

解法都在程式碼註釋當中了。

我的code:

    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.Queue;

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

        public TreeNode(int val) {
            this.val = val;

        }

    }
    */
/** * T: 把二叉樹列印成多行 * * 題目描述 * 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 * * date: 2015.12.1 15:54 * @author SSS * */ public class Solution { /** * 用佇列存放,只不過在往佇列中新增元素是,記錄新增的個數。 * 同時記錄上層總共有多少個節點,當前已經遍歷了幾個節點, 下一層已經新增進去了幾個節點 * @param
pRoot * @return */
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> resultsList = new ArrayList<ArrayList<Integer>>(); if (pRoot == null) { return resultsList; } Queue<TreeNode> newQueue = new
LinkedList<TreeNode>(); newQueue.add(pRoot); int layerCount = 1; // 當前層的節點的總個數 int upCount = 0; // 當前已經便利過的本層的節點的個數 int downCount = 0; // 下一層的節點個數統計 ArrayList<Integer> nodeList = new ArrayList<Integer>(); while (!newQueue.isEmpty()) { TreeNode tempNode = newQueue.poll(); nodeList.add(tempNode.val); upCount ++; // 若左右節點不為空,則將左右節點都新增進去 if (tempNode.left != null) { newQueue.add(tempNode.left); downCount ++; } if (tempNode.right != null) { newQueue.add(tempNode.right); downCount ++; } // 看本層的節點是否已經遍歷完 if (upCount == layerCount) { ArrayList<Integer> tarList = new ArrayList<Integer>(); for (int i = 0; i < nodeList.size(); i++) { tarList.add(nodeList.get(i)); } resultsList.add(tarList); //清空nodeList陣列 for (int i = 0; i < layerCount; i++) { nodeList.remove(0); } // 重置為零 upCount = 0; // 因為要開始遍歷下一層,要設定下一層的總個數給layerCount layerCount = downCount; // 開始遍歷下一層時,就要統計下下層的個數大小 downCount = 0; } } return resultsList; } }