无法删除BST程序中的祖父节点

时间:2018-05-25 06:28:03

标签: data-structures binary-tree

当我尝试删除具有大孩子的节点时,此二进制搜索树程序崩溃。 这样的节点是" 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 :(得分:0)

您的findMin函数定义为返回struct node *但是您返回的是找到的节点int中定义的data值,而不是struct node *。 C允许这样做,因此在编译时不会被拾取。