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 值,这里不是这种情况,所以我不明白,为什么会这样?为什么这不是编译错误?
几件事:
这个函数没有理由需要 return 任何东西。您显示的第二个版本使用 return 值在释放它们之前更新左右指针,但是(a)没有必要,因为您无论如何都要释放节点,并且(b)该值总是NULL
。因为它是一个常量,所以没有理由 return 它。
没有编译错误,因为没有类型冲突。唯一的问题是您调用的函数 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;
}
正如你所看到的,成员 left
和 rigth
被设置为 NULL 后,整个节点是 free
d。因此,就程序的正确性而言,它们的值并不重要。
函数不需要赋值。如果不需要,该值将被丢弃。
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);
我有这个代码:
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 值,这里不是这种情况,所以我不明白,为什么会这样?为什么这不是编译错误?
几件事:
这个函数没有理由需要 return 任何东西。您显示的第二个版本使用 return 值在释放它们之前更新左右指针,但是(a)没有必要,因为您无论如何都要释放节点,并且(b)该值总是
NULL
。因为它是一个常量,所以没有理由 return 它。没有编译错误,因为没有类型冲突。唯一的问题是您调用的函数 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;
}
正如你所看到的,成员 left
和 rigth
被设置为 NULL 后,整个节点是 free
d。因此,就程序的正确性而言,它们的值并不重要。
函数不需要赋值。如果不需要,该值将被丢弃。
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);