从 C 中的二叉搜索树中删除一个节点
Delete a node from binary search tree in C
我正在尝试从二叉搜索树中删除一个节点。但是当我想测试该功能时,我会在 'case 3: two children' 中收到错误消息。
clist->name = temp->name;
此行导致错误消息。它说:左操作数必须是左值。我是 C 语言和二叉搜索树的新手。我不明白,为什么这条线不起作用。我在互联网上找到了很多关于如何实现删除功能的想法。所有这些方法都使用这行代码。
完整函数如下
(greaterThan、lessThan、toLowerCase 是我实现的辅助函数。它们确实工作正常)
struct student {
int ID;
char name[20];
struct student *left;
struct student *right;
};
struct student * minValueNode(struct student* node) {
struct student* current = node;
while (current->left != NULL)
current = current->left;
return current;
}
struct student * bst_delete (struct student *clist, char* token, struct student **parent)
{
if (clist == NULL)
return clist;
char* clistName = clist->name;
char* tok = token;
toLowerCase(clistName);
toLowerCase(tok);
if (lessThan(tok, clistName))
clist->left = bst_delete(clist->left, token, &clist->left);
else if (greaterThan(tok, clistName))
clist->right = bst_delete(clist->right, token, &clist->right);
else
{
//Case 1: No children
if (clist->left == NULL && clist->right == NULL) {
free(clist);
clist = NULL;
}
//Case 2: One Child
if (clist->left == NULL) {
struct student *temp = clist;
clist = clist->right;
free(temp);
} else if (clist->right == NULL) {
struct student *temp = clist;
clist = clist->left;
free(temp);
}
//Case 3: Two Children
else {
struct student *temp = minValueNode(clist->right);
clist->name = temp->name;
clist->right = bst_delete(clist->right, temp->right, &clist->right);
}
}
return clist;
}
如果有人能告诉我为什么这条线不起作用,那就太好了。以及如何修复此错误。
谢谢!
您不能通过直接赋值在 c 中复制数组,您真正想要做的是复制数组的元素 - 为此您可以使用 strcpy -
strcpy(clist->name, temp->name);
或者因为大小不变,使用稍微安全一点的-
strncpy(clist->name, temp->name, 20);
实际上你在这里很幸运,你可以为你的名字字符串使用指针(动态分配它们),这将使该分配有效代码(尽管仍然没有按你想要的那样复制字符串内容,只是覆盖一个指针与另一个)并允许代码编译,但会导致内存泄漏和节点之间的共享指针——这将更难调试。
在这种情况下,赋值中右侧的值可能会衰减为指针,但左侧的值不能(因为该数组静态放置在结构中),所以编译器抱怨 l-值。
我正在尝试从二叉搜索树中删除一个节点。但是当我想测试该功能时,我会在 'case 3: two children' 中收到错误消息。
clist->name = temp->name;
此行导致错误消息。它说:左操作数必须是左值。我是 C 语言和二叉搜索树的新手。我不明白,为什么这条线不起作用。我在互联网上找到了很多关于如何实现删除功能的想法。所有这些方法都使用这行代码。
完整函数如下
(greaterThan、lessThan、toLowerCase 是我实现的辅助函数。它们确实工作正常)
struct student {
int ID;
char name[20];
struct student *left;
struct student *right;
};
struct student * minValueNode(struct student* node) {
struct student* current = node;
while (current->left != NULL)
current = current->left;
return current;
}
struct student * bst_delete (struct student *clist, char* token, struct student **parent)
{
if (clist == NULL)
return clist;
char* clistName = clist->name;
char* tok = token;
toLowerCase(clistName);
toLowerCase(tok);
if (lessThan(tok, clistName))
clist->left = bst_delete(clist->left, token, &clist->left);
else if (greaterThan(tok, clistName))
clist->right = bst_delete(clist->right, token, &clist->right);
else
{
//Case 1: No children
if (clist->left == NULL && clist->right == NULL) {
free(clist);
clist = NULL;
}
//Case 2: One Child
if (clist->left == NULL) {
struct student *temp = clist;
clist = clist->right;
free(temp);
} else if (clist->right == NULL) {
struct student *temp = clist;
clist = clist->left;
free(temp);
}
//Case 3: Two Children
else {
struct student *temp = minValueNode(clist->right);
clist->name = temp->name;
clist->right = bst_delete(clist->right, temp->right, &clist->right);
}
}
return clist;
}
如果有人能告诉我为什么这条线不起作用,那就太好了。以及如何修复此错误。
谢谢!
您不能通过直接赋值在 c 中复制数组,您真正想要做的是复制数组的元素 - 为此您可以使用 strcpy -
strcpy(clist->name, temp->name);
或者因为大小不变,使用稍微安全一点的-
strncpy(clist->name, temp->name, 20);
实际上你在这里很幸运,你可以为你的名字字符串使用指针(动态分配它们),这将使该分配有效代码(尽管仍然没有按你想要的那样复制字符串内容,只是覆盖一个指针与另一个)并允许代码编译,但会导致内存泄漏和节点之间的共享指针——这将更难调试。
在这种情况下,赋值中右侧的值可能会衰减为指针,但左侧的值不能(因为该数组静态放置在结构中),所以编译器抱怨 l-值。