当我尝试构建八叉树结构时堆栈溢出

时间:2013-09-25 15:47:53

标签: c++ vector tree

我想建立一个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
}

1 个答案:

答案 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 - 通过断言,或在代码中包含注释,以避免以后进行大量调试。