1. 程式人生 > >劍指Offer-二叉樹-(12)

劍指Offer-二叉樹-(12)

知識點/資料結構:二叉樹

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

注意點

觀察資料容器中賽資料的過程

import java.util.ArrayList;
import java.util.Stack;
import java.util.LinkedList;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

    }

}
*/
//和上個題的區別,換了資料結構,也就是資料的容器。
public class Solution {
   public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        //先定義一個存放返回值的容器
        ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
        
        //這個容器是存放某一次 某一行的所有資料
        ArrayList<Integer> tmp = new ArrayList<Integer>();
        
        //來敲黑板,劃重點。用連結串列來實現佇列從左到右的輸出
        LinkedList<TreeNode> q = new LinkedList<>();
        
        if(pRoot == null) return ret;
        
        
        //是每次的一個更新,就是第一次的已經放到了目標容器中,下一次會填充幾個元素
        //《劍指offer》這裡的next就是用來跟蹤的。
        q.add(pRoot);
        int now = 1, next = 0;//now表示的是這一行有幾個元素,因為第一次填充一個元素,所以初始值是1。
        while(!q.isEmpty()) {
            //這裡就是應該刪除連結串列的第一個節點;同時也把資料儲存到了t中。
            TreeNode t = q.removeFirst();//刪除一個節點,立馬需要把輸出的節點的內容放到連結串列中。這裡藉助連結串列可以刪除頭元素的性質。
            tmp.add(t.val);    //新增到陣列中,用來列印
            now--;//從這裡可以看出now表示佇列中的元素個數
             
            if(t.left != null) {
                q.add(t.left);
                next++;
            }
            if(t.right != null) {
                q.add(t.right);
                next++;
            }
            //此時此刻,需要等到next--運算元次後,直到達到所在行的最後一列。
            if(now == 0) {
                ret.add(new ArrayList<Integer>(tmp));
                
                tmp.clear();//Clear方法用於清除現有所有的元素  
                now = next;//這裡告訴now下一行需要列印幾個元素。然後在下一次while迴圈的時候
                //就可以判斷什麼時候進入這個if迴圈。
                
                next = 0;//變為0是為了從左到右繼續重新計數下一次添加了幾個元素
            }
        }
        return ret;
    }
    
}