bugfix> data-structures > 投稿

孫を持つノードを削除しようとすると、このバイナリ検索ツリープログラムがクラッシュします。 そのようなノードは「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;
      }

回答 1 件
  • findMin関数は struct node * を返すように定義されています  しかし、あなたは int を返しています  見つかったノードの data で定義された値  実際には struct node * ではありません 。 Cではこれが許可されているため、コンパイル時に選択されません。

あなたの答え