劍指Offer-二叉樹-(12)
阿新 • • 發佈:2018-12-18
知識點/資料結構:二叉樹
題目描述
從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出
注意點
觀察資料容器中賽資料的過程
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; } }