1

我想建立一个n维树。我使用 avector来存储每个节点的子节点。我写的代码给出了“堆栈溢出错误”,我不知道为什么,我确实使用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
}
4

1 回答 1

2

正如Dolda2000 所注意到的,您在递归调用时是后增量的。nbuildtree因此,在其旧值(未更改)已传递给函数n递增。因此,您有无限的调用堆栈,这自然会导致堆栈溢出。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;

您需要 anew Node(...)或将向量的值类型从 更改Node*Node, ... 或确保在取消引用之前正确设置指针。

PS 并确保n <= depth-1- 通过断言,或至少在代码中包含注释以避免以后进行大量调试。

于 2013-09-25T19:43:49.070 回答