【发布时间】:2017-10-25 17:28:24
【问题描述】:
我创建了以下函数来从树中删除节点:
void delNode(int key, Node *root) {
if(root->data != key && root->left != NULL) {
delNode(key,root->left);
}
if(root->data != key && root->right != NULL) {
delNode(key,root->right);
}
if(root->data != key && root->left == NULL) {
return;
}
if(root->data != key && root->right == NULL) {
return;
}
if(root->data == key) {
root = NULL;
return;
}
}
我有以下遍历功能
void printInorder(Node *root) {
if(root!=NULL) {
printInorder(root->left);
printf("%d ",root->data);
printInorder(root->right);
}
}
当我删除一个元素并显示树时,甚至会显示已删除的节点。
PS:我想删除整个树,保持节点为根
【问题讨论】:
-
向我们展示根有哪些元素(节点,向我们展示节点,您在其中创建该结构和所有元素)。
-
编译所有警告和调试信息:
gcc -Wall -Wextra -g和 GCC。 使用调试器gdb(和valgrind)。您的 fix-my-code 问题在这里是题外话。 -
root是指向树中节点的指针。如果您将 NULL 分配给root,这并不意味着该节点已被删除,但它只是破坏了root指针和它指向的节点的链接,但父级left或right指针仍然指向那个节点。您需要free (root)才能删除它。但是仅仅释放它是不够的,您需要断开父节点和已释放节点之间的链接(通过将 NULL 分配给各自的left或right指针)。您的delNode()函数不完整。 -
free(root) 删除根指向的位置的存在。我希望它存在,只是它必须为 NULL
标签: c data-structures recursive-datastructures