我从5层深的树的顶部节点开始,并递归地在每个节点上调用getvalue()。每个节点都链接到下一层的两个节点。我很确定这不是我的问题,因为我在纸上仔细检查了算法。然而,一旦我到达第3层,它就会给我一个分段错误。使用valgrind,我发现当我尝试打印类变量oper
时它被引发了。我不知道该去哪里,所以非常感谢你的帮助。
这是代码:
class Node {
public:
vector<Node> children;
long constval;
char oper;
void setconst();
Node();
void copy(const Node*);
int getvalue();
private:
int mult(int,int);
int div(int,int);
int add(int,int);
int sub(int,int);
};
Node::Node() {
bool c = false;
vector<char> operations;
operations.push_back('m');
operations.push_back('a');
operations.push_back('s');
operations.push_back('d');
operations.push_back('c');
constval = rand();
int randnum = rand() % 5;
cout << randnum << "\n";
oper = operations[randnum];
}
int Node::getvalue() {
cout << oper << '\n';
if (oper == 'm') {
return Node::mult(children[0].getvalue(), children[1].getvalue());
}
else if (oper == 'd') {
return Node::div(children[0].getvalue(), children[1].getvalue());
}
else if (oper == 'a') {
return Node::add(children[0].getvalue(), children[1].getvalue());
}
else if (oper == 's') {
return Node::sub(children[0].getvalue(), children[1].getvalue());
}
else if (oper == 'c') {
return constval;
}
}
编辑: 这是我的初始化算法:
class Individual {
public:
vector< vector<Node> > nodes;
vector< vector<Node> > getrand();
void replace(vector< vector<Node> >);
void mutate(double);
double run();
Individual();
};
Individual::Individual() {
nodes.resize(5);
nodes[0].resize(1);
int size = 2;
for(int i = 1; i < 5; i++) {
nodes[i].resize(size);
size = size * 2;
}
vector<char> operations;
operations.push_back('a');
operations.push_back('s');
operations.push_back('d');
operations.push_back('m');
nodes[0][0].oper = operations[rand() % 4];
for(int x = 0; x < nodes[4].size(); x++) {
nodes[4][x].setconst();
}
for(int i = 0; i < 4; i++) {
for(int x = 0; x < nodes[i].size(); x++) {
nodes[i][x].children.push_back(nodes[i+1][x*2]);
nodes[i][x].children.push_back(nodes[i+1][x*2+1]);
}
}
}
答案 0 :(得分:1)
vector<Node> children;
我和安德烈有同样的看法;我也不喜欢使用vector作为子节点容器。如果您的数据结构是一个简单的二叉树,为什么不简单地使用
Node* leftChild;
Node* rightChild;
作为Node类的数据成员?
另外,请提供创建树的代码。您可能在那里犯了一些错误,因为分段错误很可能是由于数据结构的不正确创建而您可能没有意识到它。
答案 1 :(得分:0)
初看起来,您树的最后一层似乎只包含数字。但算法并不能保证这一点。
实际上,我不喜欢矢量作为儿童容器。为什么不使用两个指针?此外,我没有看到你在哪里初始化向量并将孩子放入其中。
了解rand()
的工作原理。
答案 2 :(得分:0)
您永远不会检查您的节点是否有任何子节点。