思路:
这种层序遍历直接bfs。这里可以选择每次从队列中取一层,但是没必要,直接常规队列bfs就可以了。
好吧还是有必要的,答案输出的时候要求一层层的分开输出。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
queue<TreeNode*> q;
vector<vector<int>> ans;
int cs=0;//当前层数
void cxbl(TreeNode *root)
{
q.push(root);
while(!q.empty())
{
int s=q.size();
ans.push_back(vector<int>()); // 为当前层创建一个新向量
while(s)
{
auto t=q.front();
q.pop();
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
s--;
ans[cs].push_back(t->val);
}
cs++;
}
}
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(!root) return ans;
cxbl(root);
return ans;
}
};
注意:在这里卡了很久:
在 cxbl
函数中使用了 ans[cs].push_back(t->val);
,假设 ans
已经为每一层分配了空间。然而,如果 ans
没有提前分配足够的空间,尝试访问 ans[cs]
会导致未定义行为。
故我们加上ans.push_back(vector<int>()); // 为当前层创建一个新向量这一行代码,解决了问题。
ans.push_back(vector<int>()); // 为当前层创建一个新向量
这一条是精华所在,好好领悟!
如果不加这一行代码,后续的ans[cs]就是未定义的调用,肯定会报错的。