删除二叉搜索树的两个递归算法之间的差异

时间:2017-04-14 11:35:25

标签: 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(root != NULL)
   {
      deleteTree(root->left);
      deleteTree(root->right);
      deallocateNode(root);
   }
   root=NULL;
}

为什么呢?我需要将root设置为null,以便删除BST后的节点指针不会指向未分配的内存。 我更喜欢第二种算法,因为函数的调用更直观。

理论上,这两种算法是等价的,但如果我使用第二种算法并尝试打印BST,程序就会循环播放。

1 个答案:

答案 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,并且您不需要使用双指针。