Search code examples
cbinary-search-tree

Problem in one of the function of the BST program in C


#include <stdlib.h>

struct btNode
{
    int data;
    struct btNode *right;
    struct btNode *left;
} * root, *temp1, *temp2;

void create(int);
void insert(int);
void postorder(struct btNode *);

int main()
{
    int choice, item;

    do
    {
        printf("\nChoose one of the options:\n");
        printf("1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit\n");
        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            printf("\nEnter any number to insert:");
            scanf("%d", &item);
            insert(item);
            break;

        case 4:
            postorder(root);
            break;

        case 6:
            break;

        default:
            printf("\nWRONG INPUT");
        }
    } while (choice != 6);

    return 0;
}

void create(int num)
{
    temp1 = (struct btNode *)malloc(sizeof(struct btNode));
    temp1->data = num;
    temp1->left = NULL;
    temp1->right = NULL;
}

void insert(int num)
{
    create(num);
    if (root == NULL)
    {
        root = temp1;
        printf("%d inserted\n", root->data);
    }
    else
    {
        temp2 = root;
        while (temp2 != NULL)
        {
            //printf("inside while");
            if (temp2->data >= num)
            {
                temp2 = temp2->left;
                
            }

            else
            {
                temp2 = temp2->right;
      
            }
        }
        temp2 = temp1;
        printf("%d inserted\n", temp2->data);
    }
    
}

void postorder(struct btNode *r)
{
    if (root == NULL)
    {
        printf("Tree is empty");
        return;
    }

    else
    {
        postorder(r->left);
        postorder(r->right);
        printf("%d ", r->data);

    }
    
}

The above is an incomplete menu driven program for BST. I've right now tried to do the function for creation of node, insertion and postorder. But the main problem occurs when I insert few elements and try to do the postorder the program abruptly kills itself. I have tried to debug the program, setting the breakpoint at all the three functions. And during debugging create() and insert() function works well but the main problem occurs during postorder() function. Please help me solve the problem.


Solution

  • Please see my comments marked with // CHANGE HERE.

    Test link: https://onlinegdb.com/FK7SQ02nP

    #include <stdlib.h>
    #include <stdio.h>
    
    struct btNode
    {
        int data;
        struct btNode *right;
        struct btNode *left;
    };    // CHANGE HERE: remove globals
    
    struct btNode* create(int);    // CHANGE HERE: signature change
    struct btNode* insert(struct btNode*, int); // CHANGE HERE: signature change
    void postorder(struct btNode *);
    
    int main()
    {
        int choice, item;
        // CHANGE HERE: assign root to NULL
        struct btNode* root = NULL;
        do
        {
            printf("\nChoose one of the options:\n");
            printf("1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit\n");
            scanf("%d", &choice);
    
            switch (choice)
            {
            case 1:
                printf("\nEnter any number to insert:");
                scanf("%d", &item);
                root = insert(root, item);
                break;
    
            case 4:
                postorder(root);
                break;
    
            case 6:
                break;
    
            default:
                printf("\nWRONG INPUT");
            }
        } while (choice != 6);
    
        return 0;
    }
    
    // CHANGE HERE: return the pointer from function
    struct btNode* create(int num)
    {
        struct btNode* temp1 = (struct btNode *)malloc(sizeof(struct btNode));
        temp1->data = num;
        temp1->left = NULL;
        temp1->right = NULL;
        return temp1;
    }
    // CHANGE HERE: accept root node as argument and return the root node from function
    struct btNode* insert(struct btNode* root, int num)
    {
        // CHANGE HERE: store returned pointer
        struct btNode* temp1 = create(num);
        if (root == NULL)
        {
            root = temp1;
            printf("%d inserted\n", root->data);
        }
        else
        {
            // CHANGE HERE: see the while loop
            struct btNode* temp2 = root;
            while (temp2 != NULL)
            {
                //printf("inside while");
                if (temp2->data >= num)
                {
                    // CHANGE HERE
                    if (temp2->left)
                        temp2 = temp2->left;
                    else
                    {
                        temp2->left = temp1;
                        printf("%d inserted\n", temp2->left->data);
                        break;
                    }
                }
    
                else
                {
                    // CHANGE HERE
                    if (temp2->right)
                        temp2 = temp2->right;
                    else
                    {
                        temp2->right = temp1;
                        printf("%d inserted\n", temp2->right->data);
                        break;
                    }
                }
            }
            // CHANGE HERE: commented these two lines
            // temp2 = temp1;
            // printf("%d inserted\n", temp2->data);
        }
        return root;
    }
    
    void postorder(struct btNode *r)
    {
        // CHANGE HERE: replaced root with r
        if (r == NULL)
        {
            printf("Tree is empty");
            return;
        }
    
        else
        {
            // CHANGE HERE: call postorder only if children are not null
            if (r->left) postorder(r->left);
            if (r->right) postorder(r->right);
            printf("%d ", r->data);
        }
    }
    

    Sample Output:

    Choose one of the options:
    1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
    1
    
    Enter any number to insert:2
    2 inserted
    
    Choose one of the options:
    1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
    1
    
    Enter any number to insert:34
    34 inserted
    
    Choose one of the options:
    1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
    1
    
    Enter any number to insert:564
    564 inserted
    
    Choose one of the options:
    1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
    1
    
    Enter any number to insert:342
    342 inserted
    
    Choose one of the options:
    1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
    1
    
    Enter any number to insert:-1000
    -1000 inserted
    
    Choose one of the options:
    1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
    1
    
    Enter any number to insert:-332
    -332 inserted
    
    Choose one of the options:
    1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
    1
    
    Enter any number to insert:-987
    -987 inserted
    
    Choose one of the options:
    1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
    1
    
    Enter any number to insert:-9
    -9 inserted
    
    Choose one of the options:
    1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
    4
    -987 -9 -332 -1000 342 564 34 2 
    Choose one of the options:
    1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit