我对这两种算法有疑问:
这通常有效:
node* deleteTree(node* root)
{
if(root != NULL)
{
deleteTree(root->left);
deleteTree(root->right);
deallocateNode(root);
}
return root=NULL;
}
这句话:
void deleteTree(node* root)
{
if(root != NULL)
{
deleteTree(root->left);
deleteTree(root->right);
deallocateNode(root);
}
root=NULL;
}
为什么呢?我需要将root
设置为null
,以便删除BST后的节点指针不会指向未分配的内存。
我更喜欢第二种算法,因为函数的调用更直观。
理论上,这两种算法是等价的,但如果我使用第二种算法并尝试打印BST,程序就会循环播放。
答案 0 :(得分:2)
当您node *root
并指定node = NULL
时,它不会影响其在外部的价值。如果要修改指针值,则必须传递双指针。
类似的东西:
void deleteTree(node** root)
{
if(*root != NULL)
{
deleteTree(&((*root)->left));
deleteTree(&((*root)->right));
deallocateNode(*root);
}
*root = NULL;
}
但我真的认为你需要指定node = NULL
,因为你释放它。因此,您可以在调用deleteTree之后分配node = NULL
,并且您不需要使用双指针。