
JAVA解法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
// 定義結果集
List<List<Integer>> ret = new ArrayList<>();
// 對根節點進行判空
if (root == null) {
return ret;
}
// 定義一個存放二叉樹節點的隊列
Queue<TreeNode> queue = new LinkedList<>();
// 将根節點加入隊列
queue.offer(root);
// 隻要隊列不為空就進入循環
while (!queue.isEmpty()) {
// 定義一個存放同一層級元素的集合
List<Integer> level = new ArrayList<Integer>();
// 擷取目前的隊列長度
int currentLevelSize = queue.size();
// 周遊隊列
for (int i = 1; i <= currentLevelSize; ++i) {
// 從隊列裡拿出一個樹節點
TreeNode node = queue.poll();
// 将本樹節點的值加入本層級的集合中
level.add(node.val);
// 如果該樹節點有左子樹節點,則将其加入到隊列中,等待下層級周遊
if (node.left != null) {
queue.offer(node.left);
}
// 如果該樹節點有右子樹節點,則将其加入到隊列中,等待下層級周遊
if (node.right != null) {
queue.offer(node.right);
}
}
// 将本層級的結果加入結果集中
ret.add(level);
}
// 傳回最終結果集
return ret;
}
}
複制
題解分析
這道題首先定義一個存放結果集的集合,再對傳進來的樹節點進行判空。定義一個存放二叉樹節點的隊列,這個隊列就像吃飯用的盆,去阿姨那裡打飯盛飯用的待會飯還是進自己的肚子裡的,至于為什麼是盆不是碗就不扯太遠了。先把二叉樹的根節點放進去隊列,因為剛開始這一層級就一個根節點。ok,然後隻要隊列不為空,就進入循環。接下來義一個存放同一層級的所有元素集合,并擷取此時隊列的長度,為什麼要擷取隊列長度呢,重點來了,因為你還記得當初你把同一層級的所有元素加入了隊列,至于是多少個這裡要算清楚,因為女朋友還不是你的老婆是以還是要 AA 的,開玩笑,是因為題目要求的是同一層級的所有元素。
擷取到本層級的所有元素數量後,從隊列裡取出來你之前放進去隊列的元素,取多少個呢?你放進去多少就取多少,最多兩個,因為這是二叉樹。那怎麼保證取的那幾個就是我當初放進去的那幾個?這是隊列,隊列的性質就像高鐵的安檢,你放的行李箱後才能下一個放,然後取的時候也是你先取,是以不會取錯的(别杠,我說不會錯就是不會)。取到值後,将其加入儲存目前層級元素的集合中,并判斷該樹節點下是否還有左右子節點,存在的話還是要加入隊列,等待下層級周遊。
周遊完一層後,将儲存本層級所有元素的集合加入結果集,以此類推,直到将整棵樹周遊完,最終傳回結果集即可。