我的函数确实有问题,该函数确实从二叉树中删除了该节点。 这里是代码:
void * remove_node(Node * removed_node) {
if (removed_node->left == NULL) {
Node * right_node = removed_node->right; void * node_value = removed_node->value;
free(removed_node); removed_node = right_node;
return node_value;
} else {
/* here a code for find the node with minimal key in a right subtree */
}
}
如您所见,已删除的节点将被释放并分配给NULL指针。 另外,我有一个破坏整个树的功能:
int namespace_destructor(Node * root) {
if (root == NULL) return 0;
else {
constant_destructor(root->value); // if the current node is a pointer to existed value don't free it
if (root->left != NULL) namespace_destructor(root->left);
if (root->right != NULL) namespace_destructor(root->right);
free(root);
}
}
问题出在这里:当我打电话给namespace_destructor
时,我遇到了SEGFAULT
,因为我已经为删除的节点释放了内存。但为什么?在free(removed_node); removed_node = right_node;
这一行,我已经将NULL
指针设置为remove_node(在我的情况下,right_node
为NULL,因为removed node
是树的最后一个节点)。如果我没有释放内存,则变量root
始终不等于NULL
。
这里是Node
结构:
typedef struct Node {
int key;
void * value;
struct Node * left;
struct Node * right;
} Node;
下面是我要调用这两个函数的代码:
if (returned_value->origin != NULL) remove_node(returned_value->origin);
namespace_destructor(local_namespace);
谢谢您的关注。