当我尝试删除具有大孩子的节点时,此二进制搜索树程序崩溃。 这样的节点是" 80"。我可以成功删除任何其他节点,并执行其他操作,如遍历,查找高度和查找最小或最大元素。 请查看代码并告诉我是否需要提供任何其他信息。
struct node
{
int data;
struct node *left, *right;
};
struct node *root=NULL;
int main()
{
root=insert(root,100);
insert(root,80);
insert(root,10);
insert(root,40);
insert(root,90);
insert(root,30);
insert(root,120);
insert(root,140);
inorder(root);
printf("Min: %d Max: %d\n", FindMin(root), FindMax(root));
delete(root,80);
printf("After deletion:\n");
inorder(root);
return 0;
}
struct node *insert(struct node *node, int data)
{
if(node==NULL)
{
return newnode(data);
}
else if(data < node->data)
{
node->left=insert(node->left, data);
}
else if(data > node->data)
{
node->right=insert(node->right,data);
}
return node;
}
struct node *newnode(int data)
{
struct node *tmp=(struct node*)malloc(sizeof(struct node));
tmp->data=data;
tmp->left=tmp->right=NULL;
return tmp;
}
struct node *inorder(struct node *root)
{
if(root!=NULL)
{
inorder(root->left);
printf("%d\n",root->data);
inorder(root->right);
}
}
struct node *FindMin(struct node *root)
{
if(root==NULL)
{
printf("Tree is empty!\n");
return -1;
}
while(root->left!=NULL)
{
root=root->left;
}
return root->data;
}
struct node *FindMax(struct node *root)
{
if(root==NULL)
{
printf("Tree is empty!\n");
return -1;
}
while(root->right!=NULL)
{
root=root->right;
}
return root->data;
}
struct node *delete(struct node *root, int data)
{
if(root==NULL)
{
printf("Tree is empty!\n");
return -1;
}
else if(data < root->data)
{
root->left=delete(root->left, data);
}
else if(data > root->data)
{
root->right=delete(root->right, data);
}
else
{
if(root->left==NULL && root->right==NULL)
{
free(root);
root=NULL;
}
else if(root->left==NULL)
{
struct node *tmp=root;
// tmp=root;
root=root->right;
free(tmp);
}
else if(root->right==NULL)
{
struct node *tmp=root;
//tmp=root;
root=root->left;
free(tmp);
}
else
{
struct node *tmp=FindMin(root->right);
root->data=tmp->data;
root->right=delete(root->right,tmp->data);
} }
return root;
}
答案 0 :(得分:0)
您的findMin函数定义为返回struct node *
但是您返回的是找到的节点int
中定义的data
值,而不是struct node *
。 C允许这样做,因此在编译时不会被拾取。