C 删除二叉搜索树的两种递归算法的差异
我对这两种算法有一个问题: 这项工作正常:C 删除二叉搜索树的两种递归算法的差异,c,binary-search-tree,C,Binary Search Tree,我对这两种算法有一个问题: 这项工作正常: node* deleteTree(node* root) { if(root != NULL) { deleteTree(root->left); deleteTree(root->right); deallocateNode(root); } return root=NULL; } 这不是: void deleteTree(node* root) { if(
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,程序将进入循环。当您有
节点*根
并分配节点=空
时,它不会影响其外部值。如果要修改指针值,必须传递双指针
比如:
void deleteTree(node** root)
{
if(*root != NULL)
{
deleteTree(&((*root)->left));
deleteTree(&((*root)->right));
deallocateNode(*root);
}
*root = NULL;
}
但我并不认为您需要分配
node=NULL
,因为您已经释放了它。因此,您可以在调用deleteTree后分配node=NULL
,而无需处理双指针。我喜欢函数名,它们在试图执行的操作中很清楚,但如果(root!=NULL)…,则检查对我来说没有意义。。。其他的root=NULL;将null赋值给已经为null的对象。这一部分我不明白。在第二部分中,您只需将本地指针对象的值设置为NULL。如果要更新原始指针,则需要获取指向节点指针的指针,并更新*root=NULL
。我假设对于第一个,您可以像root=deleteTree(root)
那样调用它,因为它返回NULL,所以您的原始设置为NULL。如果你能提供完整的例子,你就不必猜测了。你应该用关键字“按值调用”和“按引用调用”在互联网上快速搜索C函数。声明节点*n=*root
可能比使用*
和&
的组合更好。事实上,这可能是第一个想法。我不想使用双指针,也不能将函数根设置为NULL,所以唯一的方法是使用返回节点指针的函数?