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);