題目描述
從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。
思考與上一道之字形打印二叉樹的區別
這個是每一行的方向一樣
先添加一層,然後把這層的節點從左到右的添加進去,只能用隊列,這樣下次添加的時候利用隊列的先進先出原則,首先取出的時上一層最左邊的節點,再依次添加,遍歷隊列藉助Iterator。
剛開始利用棧,順序弄不到,這一道與上一道很好的區別的棧和隊列的區別。
之前用對列較少,
隊列Queue是一個接口,表示一種特殊的線性表,它只允許在表的前端進行刪除操作,而在表的後端進行插入操作。
LinkedList類實現了Queue接口,因此我們可以把LinkedList當成Queue來用,還有優先級隊列PriorityQueue也是Queue的實現類
PriorityQueue是按照隊列元素的大小進行重新排序,當調用peek()或者是poll()的方法取出隊列中的元素通常都是最小的元素。
- 自然排序:集合中的元素必須實現Comparable接口,而且應該是同一個類的多個實例,否則可能導致ClassCastException異常。
- 定製排序:創建隊列時,傳入一個Comparator對象,該對象負責對隊列中的所有元素進行排序。採用定製排序時不需要元素實現Comparable接口。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if(pRoot==null){
return res;
}
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.add(pRoot);
while(!q.isEmpty()){
int cur=0;
int size=q.size();
ArrayList<Integer> value=new ArrayList<>();
Iterator<TreeNode> it=q.iterator();
while(it.hasNext()){
value.add(it.next().val);
}
res.add(value);
while(cur<size){
TreeNode node=q.poll();
if(node.left!=null)q.add(node.left);
if(node.right!=null)q.add(node.right);
cur++;
}
}
return res;
}
}