【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);
}
}
};