【Leetcode】 二叉樹層次遍歷(102)
法一:廣度優先搜索
利用隊列先進先出的規則,在遍歷二叉樹的時候,將每一層的所有節點放入隊列中,然後出隊即可,在這同時,將下一層的節點也push進了隊列中,直至遍歷完所有節點。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root==NULL)
{
return res;
}
queue<TreeNode*> q;
TreeNode* tmp;
q.push(root);
while(!q.empty())
{
vector<int> a;
int len=q.size();
for(int i=0;i<len;++i)
{
tmp=q.front();
a.push_back(tmp->val);
q.pop();
if(tmp->left)
{
q.push(tmp->left);
}
if(tmp->right)
{
q.push(tmp->right);
}
}
res.push_back(a);
}
return res;
}
};
法二:深度優先搜索
深度優先,在這裏我用的是遞歸方法,用一個變量level來標記當前的深度,最level記錄第0層根節點,代表根節點的深度。題目定義了的一個二維數組,所以我也定義了一個二維數組vv,一開始我們不知道二叉樹有多少層,因此我們只能在遍歷的過程中動態增加層數的大小,即深度。
注意點:在平時對數組的運用中我們會發現,如果長度爲len的數組array,我們訪問array[len]時,會越界。那麼在這裏,什麼時候該申請新的一層?。當level等於數組的長度時,就已經需要新申請一層了,此時我們新建一個空層,繼續往裏面加數字。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> vv;
levelOrder(root,0,vv);
return vv;
}
void levelOrder(TreeNode* node,int level,vector<vector<int>>& vv)
{
if(node==NULL)
return;
if(vv.size()==level)
vv.push_back({});
vv[level].push_back(node->val);
if(node->left)
{
levelOrder(node->left,level+1,vv);
}
if(node->right)
{
levelOrder(node->right,level+1,vv);
}
}
};