用于创建树的递归函数

时间:2016-12-17 22:00:28

标签: c recursion

我正在尝试创建一个使用递归创建树的函数,但每次尝试时我都会遇到分段错误。我创建了以下功能。你能帮我理解出了什么问题以及如何解决它吗?数据从1及以上存储在data [i]数组中。

void create_tree(nary_node* root, data *data)
{
  if(root == NULL) return;

  int i;
  static int datacount; 

  for(i=0; i<root->data.n; i++) { // For each child in the root
    append_child(root, data[datacount]);
    create_tree(root->child[i], data);
  }
}

它取决于辅助函数append_child():

void append_child(nary_node *root, data data)
{
  int i = 0;
  while (root->child[i] != NULL) i++;

  root->child[i] = create_node(data.n, data);
}

手动树构造如下:

append_child(root, data[1]);
append_child(root, data[2]);
append_child(root->child[0], data[3]);
append_child(root->child[0], data[4]);
append_child(root->child[1], data[5]);
append_child(root->child[1], data[6]);

这将创建一个树,其中包含两个来自root的节点,每个节点有两个子节点。 它手动工作正常,但我遇到了递归部分的问题。

如果需要,只需为上下文添加结构和解释:

/*
  Data contains all possible data for each node 
*/
typedef struct 
{
  int n;  // Number of children
} data;

/* 
  nary_node contains each nodes data and an array of pointers
  to it's children. An arbitrary max-value was set to 10-children.
*/
typedef struct s_nary_node 
{
  data data;
  struct s_nary_node* child[10];
} nary_node;

在main()中:

int main(void) {
   data data[99];
   nary_node *root = create_node(data[0].n, data[0]);
   create_tree(root, data);
}
create_node()中的

nary_node *create_node(int children, data data)
{
  int i = 0;
  nary_node *node = (nary_node*)malloc(sizeof(nary_node));

  for (i = 0; i < 10; i++)
    node->child[i] = NULL;

  node->data = data;
  node->data.n = children;
  return node;
}

1 个答案:

答案 0 :(得分:1)

如果您遵循递归调用,您会注意到它扩展如下:

append_child(root, data[0]);
append_child(root->child[0], data[0]);
append_child(root->child[0]->child[0], data[0]);
append_child(root->child[0]->child[0]->child[0], data[0]);
[...]
append_child(root->child[0]->[...]->child[0]->child[0], data[0]);

因为你永远不会增加datacount,显然在你的例子中data[0].n == 2 虽然简单的后期增量不会给你预期的结果,因为它会扩展为:

append_child(root, data[1]);
append_child(root->child[0], data[2]);
append_child(root->child[0]->child[0], data[3]);
append_child(root->child[0]->child[0]->child[0], data[4]);
[...]
append_child(root->child[0]->[...]->child[0]->child[0], data[?]);

而是试试这个:

void create_tree(nary_node* root, data *data)
{
    if(root == NULL) return;

    int i;
    static int datacount = 1; 

    for(i=0; i<root->data.n; i++) { // For each child in the root
        append_child(root, data[datacount++]);
    }
    for(i=0; i<root->data.n; i++) {
        create_tree(root->child[i], data);
    }
}

不那么优雅,但应该为您提供与预期手册相同的结果&#39;创作&#39;。