因此,我正在使用lintcode(编号69)编码问题。我决定使用使用传统数组作为队列的dfs。但是,它在注释行返回-1,lintcode表示这是给定输入的分段错误。这是我的代码。
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: A Tree
* @return: Level order a list of lists of integer
*/
vector<vector<int>> levelOrder(TreeNode * root) {
vector<vector<int>> result;
if(root){
TreeNode* Q[21];
int f(0),b(0);
Q[++b]=root;
while(f<b){
result.push_back(vector<int>());
for(int i=b-f;i>0;i--){
auto n=Q[f++];
result.back().push_back(n->val);//Error occured the third time running this line
if(n->left)Q[++b]=n->left;
if(n->right)Q[++b]=n->right;
}
}
}
return result;
}
};
输入是{1,2,3}作为TreeNode的序列。
答案 0 :(得分:0)
以下两行可能是罪魁祸首:
Q[++b]=root;
...
auto n=Q[f++];
首先,您使用该值作为索引将b
之前增加,所以等价于
Q[1] = root;
在第二行中,当您第一次执行时,f
的值为零,并且在 之后将其增加为索引,因此它等效于< / p>
auto n = Q[0];
现在,您尚未初始化Q[0]
,因此您将获得一个不确定的值并具有undefined behavior。
在增加之前或之后,都需要使用相同的顺序进行两次增加。我建议增加后以完全使用数组(请记住,数组索引是从零开始的。)