C:释放二进制搜索树

时间:2016-01-19 11:05:20

标签: c binary-tree free

我有这段代码:

node* free_tree(node *root){

  if(root != NULL){

    free_tree(root->left);
    free_tree(root->right);

    free(root->name);
    free(root);
  }
  return NULL;
}

我知道这不正确,正确的版本是:

root -> left = free_tree(root->left);
root -> right = free_tree(root->right);

我不明白的是,为什么这样做?当我从free_tree(root->left)返回NULL时,我的函数需要一些 node*收到NULL值,这不是这里的情况,所以我不明白,为什么这样做?为什么这不是编译错误?

3 个答案:

答案 0 :(得分:6)

一些事情:

  1. 没有理由为什么这个功能需要返回任何东西。您显示的第二个版本使用返回值在释放它们之前更新左右指针,但是(a)没有必要,因为您无论如何都要释放节点,并且(b)值总是NULL。由于它是一个常数,因此没有理由退货。

  2. 没有编译错误,因为没有类型违规。唯一的问题是您正在调用一个函数,该函数返回node *但不使用返回值。但是,这是合法的C.

答案 1 :(得分:2)

您正在删除整个树,除了应该设置为NULL的根指针(或者根本不是那个,取决于实现),节点的成员不必设置为NULL。

您的正确代码与:

相同
node* free_tree(node *root){

  if(root != NULL){

    free_tree(root->left);
    free_tree(root->right);

    root->left = NULL;
    root->right = NULL;

    free(root->name);
    free(root);
  }
  return NULL;
}

正如您在成员leftrigth设置为NULL后所看到的那样,整个节点都是free d。因此,就程序的正确性而言,他们的价值观并不重要。

答案 2 :(得分:1)

这些功能并不需要分配。如果不需要,该值就会被丢弃。

int OutputSquareValue(int value) {
   int result = value * value;
   printf("%d", result);
   return result;
}

如果您不想在代码中使用结果,但只想让它输出,那么

OutputSquareValue(5);

这完全没问题。如果您需要使用新值,请转到

printf("Squre of %d = ", x);
y = OutputSquareValue(x);
printf("%d^4 =", x);
OutputSquareValue(y);