1. 題目
從上到下列印出二叉樹的每個節點,同一層的節點按照從左到右的順序列印。
例如:
給定二叉樹: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
提示:
節點總數 <= 1000
作者:Krahets
連結:https://leetcode.cn/leetbook/read/illustration-of-algorithm/9ackoe/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
2. 解題思路
題目要求列印節點,且是按照每層從左往右的順序列印,實際上是需要實現層次遍歷。
層次遍歷需要用到佇列這個資料結構,在這裡我們使用LinkedList
資料結構模擬佇列。
基本的求解過程即:
- 建立佇列,將根節點放入佇列中;
- 當佇列非空時,取出佇列的首個節點,將節點值存入結果陣列中,同時將該節點的左右子樹節點放入佇列中;
要注意兩點:
- 結果陣列的實現:這是一個不定長的int型陣列,因此,先使用
ArrayList<Integer>
實現不定長陣列,然後將ArrayList<Integer>
轉化為int[]
,如何轉化可參考此篇博文 - 插入佇列之前,需要先對節點進行非空判斷,如果一個空節點插入佇列中,會佔據一個位置,但是實際上沒有資料,導致結果陣列中存在異常值,且可能導致佇列永遠不為空。
3. 資料型別功能函式總結
//LinkedList
LinkedList<E> listname=new LinkedList<E>();//初始化
LinkedList.add(elment);//在連結串列尾部新增元素
LinkedList.removeFirst();//取出連結串列頭部元素
LinkedList.size();//獲取元素個數
//ArrayList
ArrayList<E> listname=new ArrayList<E>();//初始化
ArrayList.add(elment);//在陣列最後插入元素
ArrayList.stream().mapToInt(Integer::valueOf).toArray();//ArrayList<Integer>轉為int[]
ArrayList.toArray();//Arraylist轉為陣列,適用於String--char[]
//int[]
arrayname=new ElementType[size];//建立大小為size的陣列,元素型別為ElementType
4. java程式碼
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
//樹節點的遍歷問題——層次遍歷--佇列
class Solution {
public int[] levelOrder(TreeNode root) {
ArrayList<Integer> result_list = new ArrayList<Integer>();//結果陣列
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();//佇列
if(root!=null){
queue.add(root);
}
while(queue.size()!=0){
TreeNode temp=queue.removeFirst();
if(temp.left!=null){
queue.add(temp.left);
}
if(temp.right!=null){
queue.add(temp.right);
}
result_list.add(temp.val);
}
return result_list.stream().mapToInt(Integer::valueOf).toArray();
}
}