C 编程二叉树删除无需转换。从函数返回后,树发生了更改

C 编程二叉树删除无需转换。从函数返回后,树发生了更改,c,tree,binary-tree,C,Tree,Binary Tree,我尝试从二叉搜索树中删除一个节点,而不进行转换。我写这段代码是为了先删除有一个子节点或没有子节点的节点。当我在函数中打印结果树时,它似乎是正确的。但当我稍后调用该函数并尝试打印树时,树发生了变化。它是如何发生的,我如何解决这个问题 这里是节点: struct node { int data; struct node* left; struct node* right; }; 下面是我如何使用num数据搜索目标节点的前一个节点 struct node * presearc

我尝试从二叉搜索树中删除一个节点,而不进行转换。我写这段代码是为了先删除有一个子节点或没有子节点的节点。当我在函数中打印结果树时,它似乎是正确的。但当我稍后调用该函数并尝试打印树时,树发生了变化。它是如何发生的,我如何解决这个问题

这里是节点:

struct node {
    int data;
    struct node* left;
    struct node* right;
};
下面是我如何使用num数据搜索目标节点的前一个节点

struct node * presearch(int num, struct node *p)
{
    struct node *n;
    struct node *m;
    m=p;
    if(num>m->data){n=m->right;}
    if(num<m->data){n=m->left;}
    while(n){
        if(num>n->data&&n->right!=NULL){
            m=n;
            n=n->right;
        }
        if(num<n->data&&n->left!=NULL){
            m=n;
            n=n->left;
        }
        if(num >n->data&&n->right==NULL){
            return NULL;
        }
        if(num <n->data&&n->left==NULL){
            return NULL;
        }
        if(num==n->data){
            break;
        }
    }
    return m;
}

请提供一份报告。这棵树是如何创建的?节点是如何插入的?如何调用
delete
函数。我们需要完整(但最少)的代码才能完全回答您的问题question@kaylum感谢提醒,我已经编辑了问题,如果出现
(numdata)
(num>root->data)
,函数
delete()
执行递归调用
root->=delete(num,root->,n),但不返回
结构节点*
值。请启用编译器的警告并删除该错误。在
//Case1:Leaf
中,释放根节点后
释放(root),而不是赋值
root=NULL
在以下if条件下发生错误
如果(root->right==NULL&&root->left!=NULL)
,则需要添加
返回(NULL)。谢谢!我根据你的建议修改了我的代码,但是我的指针在返回后仍然会改变,我不知道这是因为我返回它的方式还是其他原因
struct node * delete(int num,struct node * p,struct node * n)
{
    struct node *origin;
    origin=n;
    if(p==NULL){printf("%s\n","fail" );}
    struct node * root;
    root=p;
    if (root == NULL) {return p;}
    if (num < root->data)
        root->left = delete(num,root->left,n);
    else if (num > root->data)
        root->right = delete(num,root->right,n);
    else
    {
        //found you
        //Case1:Leaf
        if(root->right==NULL&&root->left==NULL){
        free(root);
        root=NULL;
    }
    //Case2:One Child
    //left Child
    if(root->right==NULL&&root->left!=NULL){
        struct node * temp;
        temp=presearch(num,origin);
        //On the Left
        if(temp->left){
            temp->left=root->left;
            return origin;
        }
        //On the Right
        if(temp->right){
            temp->right=root->left;
            return origin;
        }
    }
    //right Child
    if(root->right!=NULL&&root->left==NULL){
        struct node * temp;
        temp=presearch(num,root);
        //On the Left
        if(temp->left->data=root->data){
            temp->left=root->right;
            return origin;
        }
        //On the Right
        if(temp->right->data=root->data){
            temp->right=root->right;
            return origin;
        }
    }
    //Case3: Two Children
    return p;
    }
}
struct node *o;
o=delete(15,root,root);