0x01.問題
給你一個二叉樹,請你返回其按 層序遍歷 得到的節點值。 (即逐層地,從左到右訪問所有節點)。
示例:
二叉樹:
[3,9,20,null,null,15,7],3 / \ 9 20 / \ 15 7
返回其層次遍歷結果:
[
[3],
[9,20],
[15,7]
]
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
public List<List<Integer>> levelOrder(TreeNode root)
0x02.簡要分析
-
我們知道,如果要直接輸出二叉樹的中序遍歷的話,很容易,只需要使用隊列,第一次存入根節點,之後在每次輸出對頭元素之後,再繼續把左右孩子節點入隊。
-
其實把這個中序序列存入一個集合中,大體方法還是一樣的,不過對於層級的劃分,需要額外的考慮了,因爲是二級集合,所以要確定每一層存入的是哪些節點。
- 最爲容易想到的辦法,是維護一個狀態
(TreeNode,level)
,表示每個節點的層級,子樹層級加1,最後根據層級再重新進行存儲。但是,這需要消耗更多額外的空間,也沒有更好的辦法呢? - 我們知道,BFS在遍歷的時候,是把左右孩子都存入隊列中,那麼在一層中存入的左右孩子,層級應該是相同的,也就是說,如果我們每次在BFS的時候,每次遍歷完一層,就可以清楚的把層級相同的分個一個集合中,完成了最終的目的。
- 最爲容易想到的辦法,是維護一個狀態
-
詳細算法:
- (1)構造二級集合,如果
root
爲空,直接返回。否則創建隊列,並將根節點存入隊列。 - (2)當隊列不爲空時,取出當前隊列的長度
currSize
,遍歷所有這一層的節點,並在遍歷的時候完成節點的存儲,左右孩子的入隊。
- (1)構造二級集合,如果
0x03.解決代碼–BFS
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans=new ArrayList<>();
if(root==null){
return ans;
}
Deque<TreeNode> q=new ArrayDeque<>();
q.addLast(root);
while(!q.isEmpty()){
int currSize=q.size();
List<Integer> f=new ArrayList<>();
for(int i=1;i<=currSize;i++){
TreeNode curr=q.removeFirst();
f.add(curr.val);
if(curr.left!=null){
q.addLast(curr.left);
}
if(curr.right!=null){
q.addLast(curr.right);
}
}
ans.add(f);
}
return ans;
}
}
ATFWUS --Writing By 2020–05-13