我想建立一个n维树。我使用vector
来存储每个节点的子节点。我写的代码给出了“堆栈溢出错误”,我不知道为什么,我使用new
。如果有人能告诉我哪里出错了,我将非常感激。
class Node
{
public:
int q_number;
int layer;
int value;
vector<Node*> n_list;
Node(int n):q_number(n),n_list(n) //initialize node vector
{
}
};
Node* buildtree(int n,int depth)
{
Node * node = new Node(depth);
if(n==depth-1)
{
for(int i = 0; i<depth;i++)
{
node->n_list[i] = NULL;
node->n_list[i]->value = i;
node->n_list[i]->layer = depth-1;
}
}
else
{
for (int i =0;i<depth;i++)
{
node->n_list[i] = buildtree(n++,depth);// span the tree recursively
node->n_list[i]->value = i;
node->n_list[i]->layer = n; // the layer value
}
}
return node;
}
int main()
{
Node * tree = buildtree(0,8); // build an octree
}
答案 0 :(得分:2)
当注意到Dolda2000时,您在递归调用n
时后递增buildtree
。因此,{/ 1>在之后递增,其旧值(未更改)已传递给函数。因此,您有一大堆n
次调用,这自然会导致堆栈溢出。
Pre -incrementing - buildtree(0,8);
- 可以解决堆栈溢出问题,但在这种情况下不你想要什么,因为你使用了递归调用后buildtree(++n,depth);
。据我了解你的意图,你不希望递归调用后n
的值发生变化。
您案例中的解决方案只是:
n
您的代码中还有另一个问题:
buildtree(n+1,depth);
您需要 node->n_list[i] = NULL; // ok, the pointer is NULL now
node->n_list[i]->value = i; // trying to dereference a NULL pointer => error
node->n_list[i]->layer = depth-1;
,或者将new Node(...)
的矢量值类型更改为Node*
,...或者在解除引用之前确保指针已正确设置。
P.S。并确保Node
- 通过断言,或在代码中包含注释,以避免以后进行大量调试。