【发布时间】:2015-01-14 07:40:00
【问题描述】:
假设:deleteTree() 函数删除树,但不会将 root 更改为 NULL,如果 deleteTree() 的用户没有将 root 更改为 NULL 并尝试使用 root 指针访问值,这可能会导致问题。我们可以修改 deleteTree() 函数以引用根节点,这样就不会出现这个问题。
[链接]http://www.geeksforgeeks.org/write-a-c-program-to-delete-a-tree/
疑问:在 deleteTree 函数中,从主节点传递了节点的副本,那么如何在 deleteTree() 中释放所有这些节点的实际内存。据说树被删除了,但是要删除的树不应该传递地址。另外,如果我们认为树实际上被删除了,那么根节点也会随之被删除,那么为什么它在主节点中不更改为 NULL?
void deleteTree(struct node* node)
{
if (node == NULL) return;
deleteTree(node->left);
deleteTree(node->right);
printf("\n Deleting node: %d", node->data);
free(node);
}
int main()
{
struct node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
deleteTree(root);
root = NULL;
printf("\n Tree deleted ");
getchar();
return 0;
}
修改后的代码:
void _deleteTree(struct node* node)
{
if (node == NULL) return;
_deleteTree(node->left);
_deleteTree(node->right);
printf("\n Deleting node: %d", node->data);
free(node);
}
void deleteTree(struct node** node_ref)
{
_deleteTree(*node_ref);
*node_ref = NULL;
}
int main()
{
struct node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
deleteTree(&root);
printf("\n Tree deleted ");
getchar();
return 0;
}
在这种情况下,如果我们在 main 而不是在 deleteTree 函数中设置 root=NULL 怎么办?
【问题讨论】:
-
@Sourav Ghosh 在第一个代码中,只传递了节点指针,而不是它的地址,如果我们希望将更改反映在 deleteTree 函数之外,我们应该传递我的地址知道。
-
对不起,我误读了您的代码。删除了 cmets。
-
@Sourav Ghosh 但是为什么我们不能在第一种情况下将 root 设置为 NULL 而在第二种情况下可以这样做呢?