我编写了一个程序,该程序将带有两个参数f1和f2,两个文件都带有数字。该程序应可按如下方式调用树f1 f2
f1具有数百万个唯一数字,每行一个。每个数字都应读取并插入二叉树中。插入这些文件后,程序应从第二个文件中读取数字。对于每个数字,必须执行以下操作
-在树中搜索号码
-如果存在,请将其从树中删除
现在,我用于插入和搜索的代码给出了正确的结果,但是在删除的一部分中存在一些错误。请通过修改代码来帮助我。
#include<stdio.h>
#include<stdlib.h>
struct node
{
int info;
struct node *left, *right;
};
struct node* insert(struct node* root, int item)
{
struct node *temp,*temp1,*pre;
temp = (struct node *)malloc(sizeof(struct node));
temp->info = item;
temp->left = temp->right = NULL;
if (root == NULL)
root=temp;
else
{
temp1=root;
while(temp1!=NULL)
{
pre=temp1;
if(item<temp1->info)
temp1=temp1->left;
else
temp1=temp1->right;
}
if(item<pre->info)
pre->left=temp;
else
pre->right=temp;
}
return root;
}
struct node *create(struct node *root)
{
int num;
root=NULL;
FILE *fp1=fopen("myFile1.txt","r");
if (fp1 == NULL)
{
printf("cannot open this file");
exit(0);
}
while(fscanf(fp1,"%d",&num)==1)
root=insert(root,num);
return root;
fclose(fp1);
}
struct node * min(struct node* ptr)
{
struct node* current = ptr;
while (current->left != NULL)
current = current->left;
return current;
}
struct node* delete(struct node* root,int n)
{
if(root==NULL)
return root;
if(n<root->info)
root->left=delete(root->left,n);
else if(n>root->info)
root->right=delete(root->right,n);
else
{
if(root->left==NULL)
{
struct node *p;
p=root->right;
free(root);
return p;
}
else
if(root->right==NULL)
{
struct node *p;
p=root->left;
free(root);
return p;
}
struct node *p;
p=min(root->right);
root->info=p->info;
root->right=delete(root->right,p->info);
}
return root;
}
void search(struct node *root)
{
int Y,X;
struct node *t;
t=root;
char ch='n';
FILE *fp2=fopen("myFile2.txt","r");
if (fp2 == NULL)
{
printf("cannot open this file");
exit(0);
}
X=0;
while(fscanf(fp2,"%d",&Y)==1)
{
while(t!=NULL && X==0)
{
if(Y==t->info)
{
X=1;
break;
}
else
if(Y<t->info)
t=t->left;
else
t=t->right;
}
if(X==1)
printf(" %d is found %d\n",Y,X);
printf("if you want to delete a number ");
scanf("%c",&ch);
if(ch=='y')
{
root=delete(root,Y);
return root;
}
else
printf("%dNot found %d\n",Y,X);
}
fclose(fp2);
}
void inorder(struct node *root)
{
if (root != NULL)
{
inorder(root->left);
printf("%d ", root->info);
inorder(root->right);
}
}
void main()
{
struct node *root = NULL;
struct node *ptr = NULL;
root=create(root);
inorder(root);
search(root);
inorder(root);
}
最佳答案
没有休假时不支持情况。在比赛开始时也要处理:
if(root->rigt == NULL && root->left==NULL)
{
free(root);
return NULL;
}
关于c - 在c中的二叉搜索树中删除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35155900/