Solved

Crashing when deleting value with no child in Binary Tree

Posted on 2017-04-12
4
26 Views
Last Modified: 2017-04-12
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. :)
0
Comment
Question by:Jad Dava
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
4 Comments
 
LVL 56

Accepted Solution

by:
Julian Hansen earned 500 total points
ID: 42090398
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
0
 
LVL 56

Assisted Solution

by:Julian Hansen
Julian Hansen earned 500 total points
ID: 42090399
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

0
 

Author Comment

by:Jad Dava
ID: 42090490
Thank you! I did try adding elses before the ifs but I may have added them in the wrong places.
0
 
LVL 56

Expert Comment

by:Julian Hansen
ID: 42090497
You are welcome.
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Join & Write a Comment

In this post we will learn different types of Android Layout and some basics of an Android App.
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.

756 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question