一道BFS的题目,也就是层次遍历并输出。由于用的是vector套vector的结构,需要预先定义好,可以用push_back直接存进去
相当于又默写了一遍,还有很多地方不完善,详见注释:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res; //一个存储返回值结果
vector<int> level; //用于存储每一层的节点的值
if(root==NULL) return res;
queue<TreeNode*> q; //用于广度遍历时存储节点 记住类型是TreeNode
TreeNode* node;
int currlev=1;
int nextlev=0;
q.push(root);
while(!q.empty()){
node=q.front(); //这句话少了
q.pop();
currlev--;
level.push_back(node->val);
if(node->left){
q.push(node->left);
nextlev++;
}
if(node->right){
q.push(node->right);
nextlev++;
}
if(currlev==0){
res.push_back(level);
//nextlev--;
currlev=nextlev;
nextlev=0; //直接置为0 开始下一层
level.clear();
}
}
return res;
}
};
还有一个比较好的递归的算法,原文地址如下:
https://leetcode.com/discuss/81916/clean-recursive-c-solution
class Solution {
private:
vector<vector<int>> abc;
public:
void helper(TreeNode* root, int level) {
if(abc.size() < level+1) abc.push_back(vector<int>(1,root->val));
else abc[level].push_back(root->val);
if(root->left) helper(root->left,level+1);
if(root->right) helper(root->right,level+1);
}
vector<vector<int>> levelOrder(TreeNode* root) {
if(root) helper(root,0);
return abc;
}