C:释放二叉搜索树

C: Freeing Binary Search Tree

我有这个代码:

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);

我不明白的是,为什么这行得通?当我 return from free_tree(root->left) 和 NULL 时,我的函数需要一些 node* 收到 NULL 值,这里不是这种情况,所以我不明白,为什么会这样?为什么这不是编译错误?

几件事:

  1. 这个函数没有理由需要 return 任何东西。您显示的第二个版本使用 return 值在释放它们之前更新左右指针,但是(a)没有必要,因为您无论如何都要释放节点,并且(b)该值总是NULL。因为它是一个常量,所以没有理由 return 它。

  2. 没有编译错误,因为没有类型冲突。唯一的问题是您调用的函数 return 是 node * 但没有使用 return 值。但是,这是合法的 C.

您正在删除整棵树,除了应该设置为 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 后,整个节点是 freed。因此,就程序的正确性而言,它们的值并不重要。

函数不需要赋值。如果不需要,该值将被丢弃。

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);