gpt4 book ai didi

c - 释放后二叉树删除设置为 NULL

转载 作者:太空宇宙 更新时间:2023-11-04 06:12:31 25 4
gpt4 key购买 nike

我在 c 中执行二叉树删除。有趣的是,我尝试了几种方法,这种奇怪的情况出现了。

void Delete(){
struct BinaryTree* ptr = root;
int element;
printf("Enter element to delete : ");
scanf("%d",&element);
while(ptr){
if(element>ptr->data)
ptr = ptr->right;
else if(element<ptr->data)
ptr = ptr->left;
else
break;
}
if(ptr->left && ptr->right){
struct BinaryTree **smallest = &(ptr);
smallest = &((*smallest)->right);
while((*smallest)->left){
smallest = &((*smallest)->left);
}
ptr->data = (*smallest)->data;
free(*smallest);
*smallest = NULL;

} else if(ptr->left){
/*rest cases*/
}

}

上面的代码有效,它将 NODE 设置为 NULL。

但是当我以这种方式执行此过程时,它不会设置为 NULL。

if(ptr->left && ptr->right){
struct BinaryTree *smallest = ptr;
smallest = smallest->right;
while(smallest->left){
smallest = smallest->left;
}
ptr->data = smallest->data;
struct BinaryTree **refsmall = &smallest;
free(*refsmall);
*refsmall = NULL;
}

这两个方法不是一样的吗?如果没有,有人可以向我解释它们有何不同吗?为什么第一种方法有效而第二种方法无效?

最佳答案

您应该避免在代码中使用全局变量。如果你真的想使用全局变量,删除的第一个版本应该是这样的:

void Delete(){
/* at some point you will need to change the 'real' root, not the copy of it */
struct BinaryTree **ptr = &root;
int element;
printf("Enter element to delete : ");
scanf("%d",&element);
while(*ptr){
if(element > (*ptr)->data)
ptr = &(*ptr)->right;
else if(element < (*ptr)->data)
ptr = &(*ptr)->left;
else
break;
}
if((*ptr)->left && (*ptr)->right){
struct BinaryTree **smallest = ptr;
smallest = &(*smallest)->right;
while((*smallest)->left){
smallest = &(*smallest)->left;
}
(*ptr)->data = (*smallest)->data;
free(*smallest);
*smallest = NULL;

} else if((*ptr)->left){
/*rest cases*/
}
}

在第一个版本中,您将无法删除根目录。

关于c - 释放后二叉树删除设置为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53397772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com