递归如何使用 Void 而不是函数的逻辑

The Logic on How Rekursion Functions with Void instead of Functions

这是一个简单的二叉树节点删除函数,现在我想将 removeElement 函数改为 void。至少从我收集到的信息来看,大多数教程都没有涵盖如何做到这一点。

基本代码:

struct treeNode* removeElement(struct treeNode *root, int data)
{
    if(root==NULL)
        return NULL;
    if (data>root->data)
        root->right = removeElement(root->right, data);
    else if(data<root->data)
        root->left = removeElement(root->left, data);
    else
    {
        
        if(root->left==NULL && root->right==NULL)
        {
            free(root);
            return NULL;
        }

        else if(root->left==NULL || root->right==NULL)
        {
            struct treeNode *temp;
            if(root->left==NULL)
                temp = root->right;
            else
                temp = root->left;
            free(root);
            return temp;
        }

        else
        {
            struct treeNode *temp = find_minimum(root->right);
            root->data = temp->data;
            root->right = removeElement(root->right, temp->data);
        }
    }
    return root;
}

我试过的

void removeElement(struct treeNode **root, int data)
{
    if(*root==NULL)
        return;//dont know if this is correct
    if (data>(*root)->data)
         removeElement(&(*root)->right, data);
    else if(data<(*root)->data)
        removeElement(&(*root)->left, data);
    else
    {
        //dont know how to continue 
        if((*root)->left==NULL && (*root)->right==NULL)
        {
        }
         else if(*root)->left==NULL || *root)->right==NULL)
          {}

我的主要问题是我不知道代码应该是什么样子,因为我不能在 void 中 return,所以递归对我来说变得很棘手。如果有人愿意帮助我 else if(*root)->left==NULL || *root)->right==NULL) 我相信我可以处理剩下的事情。

我不知道这是否有效 question/answered 之前。如果不是,请告诉我。如果需要,我会尝试改进它或删除问题。感谢您提供的任何帮助。

您发送了指向 'left' 或 'right' 的指针,它们是此叶的 parent 节点的成员。所以,你只需要释放它并进行 NULLify,如下所示:

       if((*root)->left==NULL && (*root)->right==NULL)
        {
            free(*root);
            *root = NULL;
            return;
        }

在第二部分,如果节点只有一个 child,根据你的算法,这个 child 被重新分配给 parent 的相应分支。我认为,以下是正确的:

else if((*root)->left==NULL || (*root)->right==NULL)
        {            
            struct treeNode *temp;
            if(root->left==NULL)
                temp = (*root)->right;
            else
                temp = (*root)->left;
            free(*root);
            *root = temp; // << assign temp to the parents left or right
            return ;
        }