把二叉樹打印成多行(利用隊列的先進先出)

題目描述

從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。

思考與上一道之字形打印二叉樹的區別 

這個是每一行的方向一樣

先添加一層,然後把這層的節點從左到右的添加進去,只能用隊列,這樣下次添加的時候利用隊列的先進先出原則,首先取出的時上一層最左邊的節點,再依次添加,遍歷隊列藉助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;
		
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章