Не удается удалить родительский узел в программе BST - PullRequest
0 голосов
/ 25 мая 2018

Эта программа дерева двоичного поиска аварийно завершает работу, когда я пытаюсь удалить узел, имеющий внуков.Такой узел "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 Ответ

0 голосов
/ 25 мая 2018

Ваша функция findMin определена так, чтобы возвращать struct node *, однако вы возвращаете значение int, определенное в data найденного узла, а не struct node *.C позволяет это, поэтому он не поднимается при компиляции.

...