Crashing when deleting value with no child in Binary Tree

Jad Dava
Jad Dava used Ask the Experts™
on
In my binary tree, I can delete values that have other values extending from it. If they don't, or if it is the only value, the program crashes. Not sure how to fix it. This is the deletion part of the code:

void delete_tree (binarytree *t, int x)
{
   binarytree temp;

   if (!is_empty(*t))
   {
       if (x == (*t)-> data)
       {
           if (((*t) -> left == NULL)&&((*t) -> right == NULL))
           {
               temp = (*t);
               (*t) = NULL;
               free (temp);
           }

           if (((*t) -> left != NULL)&&((*t)-> right == NULL))
           {
                temp = (*t);
                (*t) = (*t) -> left;
                free (temp);
           }
           if (((*t)-> left == NULL)&&((*t)-> right != NULL))
           {
               temp = (*t);
               (*t) = (*t) -> right;
               free (temp);
           }
           if (((*t) -> left != NULL)&&((*t) -> right != NULL))
           {
               temp = (*t)-> right;
                   while (temp -> left != NULL)
                       {
                           temp = (*t) -> left;
                       }

               temp -> left = (*t) ->left;
               temp = (*t);
               (*t) = (*t) -> right;
               free (temp);

           }

       }
       else {
            if ( x <= (*t) -> data)
                delete_tree(&(*t) -> left, x);

            else
                delete_tree(&(*t) -> right, x);
        }


   }
   else printf("No data found.\n");
}

Open in new window


I'm a noobie at programming so any help would be appreciated. :)
Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Most Valuable Expert 2017
Distinguished Expert 2018
Commented:
Look at line 16 - what happens when you get there and you have just been through lines 9 - 14? You have wiped out your tree and then on line 16 you are testing it.

There needs to be a return in your different cases - or an else before each
Most Valuable Expert 2017
Distinguished Expert 2018
Commented:
So either
void delete_tree (binarytree *t, int x)
{
   binarytree temp;

   if (!is_empty(*t))
   {
       if (x == (*t)-> data)
       {
           if (((*t) -> left == NULL)&&((*t) -> right == NULL))
           {
               temp = (*t);
               (*t) = NULL;
               free (temp);

               // ADD A RETURN
               return;
           }

           if (((*t) -> left != NULL)&&((*t)-> right == NULL))
           {
                temp = (*t);
                (*t) = (*t) -> left;
                free (temp);

               // ADD A RETURN
               return;
           }
           if (((*t)-> left == NULL)&&((*t)-> right != NULL))
           {
               temp = (*t);
               (*t) = (*t) -> right;
               free (temp);

               // ADD A RETURN
               return;
           }
           if (((*t) -> left != NULL)&&((*t) -> right != NULL))
           {
               temp = (*t)-> right;
                   while (temp -> left != NULL)
                       {
                           temp = (*t) -> left;
                       }

               temp -> left = (*t) ->left;
               temp = (*t);
               (*t) = (*t) -> right;
               free (temp);
           }
      }
       else {
            if ( x <= (*t) -> data)
                delete_tree(&(*t) -> left, x);

            else
                delete_tree(&(*t) -> right, x);
        }


   }
   else printf("No data found.\n");
}

Open in new window

Or
void delete_tree (binarytree *t, int x)
{
   binarytree temp;

   if (!is_empty(*t))
   {
       if (x == (*t)-> data)
       {
           if (((*t) -> left == NULL)&&((*t) -> right == NULL))
           {
               temp = (*t);
               (*t) = NULL;
               free (temp);
           }

           // ADD AN ELSE
           else if (((*t) -> left != NULL)&&((*t)-> right == NULL))
           {
                temp = (*t);
                (*t) = (*t) -> left;
                free (temp);
           }

           // ADD AN ELSE
           else if (((*t)-> left == NULL)&&((*t)-> right != NULL))
           {
               temp = (*t);
               (*t) = (*t) -> right;
               free (temp);
           }

           // ADD AN ELSE
           else if (((*t) -> left != NULL)&&((*t) -> right != NULL))
           {
               temp = (*t)-> right;
                   while (temp -> left != NULL)
                       {
                           temp = (*t) -> left;
                       }

               temp -> left = (*t) ->left;
               temp = (*t);
               (*t) = (*t) -> right;
               free (temp);
           }

       }
       else {
            if ( x <= (*t) -> data)
                delete_tree(&(*t) -> left, x);

            else
                delete_tree(&(*t) -> right, x);
        }


   }
   else printf("No data found.\n");
}

Open in new window

Jad DavaStudent

Author

Commented:
Thank you! I did try adding elses before the ifs but I may have added them in the wrong places.
Most Valuable Expert 2017
Distinguished Expert 2018

Commented:
You are welcome.

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial