題目
給定一個二叉樹,返回其按層次遍歷的節點值。 (即逐層地,從左到右訪問所有節點)。
例如:
給定二叉樹: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其層次遍歷結果:
[
[3],
[9,20],
[15,7]
]
思路
層次遍歷實際上就是使用廣度優先遍歷(BFS)從root開始遍歷。我們學資料結構的時候知道,BFS一般用佇列作輔助,DFS一般用棧進行輔助。
所以在這一題我們使用佇列輔助進行廣度優先遍歷。每次pop一個元素,就判斷其有無左右孩子,若有則將孩子加進佇列。
這一題的一個難點是,如何區分層次,使不同層次的數在不同的行上?
遇到這種情況我們一般用一個標記值,而這題的佇列儲存的是地址。所以我們將NULL設為這個標記值。
作用是:每當一個層次的數全部pop()後,緊隨其後的就是NULL。也就是在佇列中用NULL把各個層次分開。
我們首先初始的時候在root後加一個NULL。之後的過程中每讀到一個NULL就push一個新的NULL。
class Solution
{
public:
vector<vector<int>> levelOrder(TreeNode *root)
{
if (root == NULL)
return {};
vector<vector<int>> ans;
queue<TreeNode *> temp;
temp.push(root);
temp.push(NULL);
vector<int> cur_vec;
while(!temp.empty()){
TreeNode *t = temp.front();
temp.pop();
if(t==NULL){
ans.push_back(cur_vec);
cur_vec.resize(0);
if(temp.size()>0){
temp.push(NULL);
}
}else{
cur_vec.push_back(t->val);
if(t->left)
temp.push(t->left);
if(t->right)
temp.push(t->right);
}
}
return ans;
}
};