akkhil
akkhil

Reputation: 439

C Programming Binary Tree Insertion Recursively (Not Binary Search Tree)

This is my code here. I want to insert the items recursively into the binary tree. It's not a binary search tree (left child need not be < parent or right child need not be > parent).

It's simply a binary tree where there can be at most two children for each node. When I execute the traversal, it just prints out the starting node endlessly in an infinite loop (5-> 5-> 5->....). Please help me out.

I've searched through Stack Overflow and nothing is based on this. Most are binary search trees. I'm sorry if this is a bad question.

struct node {
    int info;
    struct node* left;
    struct node* right;
}*temp, *ptr, *prev;

struct node *root, *start=NULL;

void insert(struct node*);
void inorder(struct node*);

void insert(struct node* ptr)
{
    int ch;

    if(start==NULL)  // if start is null, new node is made as start node.
        start=ptr;
    else
    {
        temp=(struct node*)malloc(sizeof(struct node)); //new node created
        temp->left=NULL;
        temp->right=NULL;
        puts("Enter value");
        scanf("%d", &temp->info);
        ptr=temp;     //ptr is set as new node
    }

    printf("Does %d have a left node? (1/0)\n", ptr->info);
    scanf("%d", &ch);
    if(ch==1)
    {
        prev=ptr;
        if(ptr==start)
            insert(start->left); //start->left will be the new 'ptr' in the next insertion scenario
        else
            insert(ptr->left);  //same principle as above
    }

    printf("Does %d have a right node? (1/0)\n", ptr->info);
    scanf("%d", &ch);
    if(ch==1)
    {
        prev=ptr;
        if(start==ptr)
            insert(start->left);
        else
            insert(ptr->right);
    }

}

void inorder(struct node* ptr)
{
    while(ptr!=NULL)
    {
        inorder(ptr->left);
        printf("%d -> ", ptr->info);
        inorder(ptr->right);
    }
}

void main(){
    int ch;
    do{
        puts("1. Insert 2.Traverse 3.Exit");
        scanf("%d",&ch);
        switch(ch){
            case 1:
                puts("Enter root node");
                root=(struct node *)malloc(sizeof(struct node));
                root->left=NULL;
                root->right=NULL;
                scanf("%d", &root->info);
                insert(root);
                break;
            case 2:
                inorder(start);
        }
    }while(ch!=3);
}

Thanks in advance, guys.

Upvotes: 0

Views: 1608

Answers (3)

huxley
huxley

Reputation: 307

your traversal create infinite loop, you should change the while to if

void inorder(struct node* ptr)
{
    if (ptr != NULL)
    {
        inorder(ptr->left);
        printf("%d -> ", ptr->info);
        inorder(ptr->right);
    }
}

in insert(struct node* ptr) when you do ptr=temp; it's only changing ptr inside the function scope, so actually you never assign left and right nodes for the root

Upvotes: 3

akkhil
akkhil

Reputation: 439

I have found the solution for this. Sorry for wasting your time. The problem with my code was:

1) The while instead of if in the traversal function 2) Secondly, when I pass the argument ptr, it doesn't know where to link that ptr to. All I'd been doing was ptr=temp. It must link to the previous node's left/right, right?

@huxley's explanation along the lines of function scope was wrong. It must point to the same object - that's why we use pointers, right? However, it rang a bell in my head. So here's the solution below:

void insert(struct node* ptr, int side)
{
    int ch;

    if(start==NULL)  // if start is null, new node is made as start node.
        start=ptr;
    else
    {
        temp=(struct node*)malloc(sizeof(struct node)); //new node created
        temp->left=NULL;
        temp->right=NULL;
        puts("Enter value");
        scanf("%d", &temp->info);
        ptr=temp;
        if(side==1)
            prev->left=ptr;
        else
            prev->right=ptr;
    }

    printf("Does %d have a left node? (1/0)\n", ptr->info);
    scanf("%d", &ch);
    if(ch==1)
    {
        prev=ptr;
        insert(ptr->left, 1);
    }

    printf("Does %d have a right node? (1/0)\n", ptr->info);
    scanf("%d", &ch);
    if(ch==1)
    {
        prev=ptr;
        insert(ptr->right, 2);
    }

}

void inorder(struct node* ptr)
{
    if(ptr!=NULL)
    {
        inorder(ptr->left);
        printf("%d -> ", ptr->info);
        inorder(ptr->right);
    }
}

I explained it detailedly because there's not a proper insertion code for binary tree using recursion. I hope everyone understands.

Thanks everyone who helped.

Cheers, Akhil

Upvotes: 0

CiaPan
CiaPan

Reputation: 9570

Try this way of adding nodes:

struct node *createTree()
{
    struct node *node;
    int resp;

    node=malloc(sizeof(struct node)); //new node created
    node->left=NULL;
    node->right=NULL;
    puts("Enter value");
    scanf("%d", &node->info);

    printf("Does %d have a left node? (1/0)\n", node->info);
    scanf("%d", &resp);
    if(resp==1)
        node->left = createTree();

    printf("Does %d have a right node? (1/0)\n", node->info);
    scanf("%d", &resp);
    if(resp==1)
        node->right = createTree();

    return node;
}

then in main() do:

root = createTree();

Note the resp variable is of type int if you scan it with "%d" format. For type char you should use format "%c".

Upvotes: 0

Related Questions