Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 删除二叉搜索树的两种递归算法的差异_C_Binary Search Tree - Fatal编程技术网

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,所以唯一的方法是使用返回节点指针的函数?