Data Structures - 8

AIM: Write C Programs to implement Binary Search Tree.


Code:

#include <stdio.h >

#include <stdlib.h>

 

  struct node

  {

    int info;

    struct node * lchild;

    struct node * rchild;

  }*root;

 

void find(int item, struct node **par, struct node **loc)

{

  struct node *ptr, *ptrsave;

 

  if (root == NULL)

  {

    *loc = NULL;

    *par = NULL;

    return;

  }

 

  if (item == root->info)

  {

    *loc = root;

    *par = NULL;

    return;

  }

 

  if (item < root->info)

    ptr = root->lchild;

  else

    ptr = root->rchild;

  ptrsave = root;

 

  while (ptr != NULL)

  {

    if (item == ptr->info)

    {*loc = ptr;

      *par = ptrsave;

      return;

    }

 

    ptrsave = ptr;

    if (item < ptr->info)

      ptr = ptr->lchild;

    else

      ptr = ptr->rchild;

  }

 

  *loc = NULL;

  *par = ptrsave;

}

 

void insert(int item)

{

  struct node *tmp, *parent, *location;

  find(item, &parent, &location);

  if (location != NULL)

  {

    printf("Item already present");

    return;

  }

 

  tmp = (struct node *) malloc(sizeof(struct node));

  tmp->info = item;

  tmp->lchild = NULL;

  tmp->rchild = NULL;

 

  if (parent == NULL)

    root = tmp;

  else

  if (item < parent->info)

    parent->lchild = tmp;

  else

    parent->rchild = tmp;

}

 

void case_a(struct node *par, struct node *loc)

{

  if (par == NULL)

    root = NULL;

  else

  if (loc == par->lchild)

    par->lchild = NULL;

  else

    par->rchild = NULL;

}

 

void case_b(struct node *par, struct node *loc)

{

  struct node * child;

  if (loc->lchild != NULL)

    child = loc->lchild;

  else

    child = loc->rchild;

 

  if (par == NULL)

    root = child;

  else

  if (loc == par->lchild)

    par->lchild = child;

  else

    par->rchild = child;

}

 

void case_c(struct node *par, struct node *loc)

{

  struct node *ptr, *ptrsave, *suc, *parsuc;

 

  ptrsave = loc;

  ptr = loc->rchild;

  while (ptr->lchild != NULL)

  {

    ptrsave = ptr;

    ptr = ptr->lchild;

  }

 

  suc = ptr;

  parsuc = ptrsave;

 

  if (suc->lchild == NULL && suc->rchild == NULL)

    case_a(parsuc, suc);

  else

    case_b(parsuc, suc);

 

  if (par == NULL)

    root = suc;

  else

  if (loc == par->lchild)

    par->lchild = suc;

  else

    par->rchild = suc;

 

  suc->lchild = loc->lchild;

  suc->rchild = loc->rchild;

}

 

int del(int item)

{

  struct node *parent, *location;

  if (root == NULL)

  {

    printf("Tree empty");

    return 0;

  }

 

  find(item, &parent, &location);

  if (location == NULL)

  {

    printf("Item not present in tree");

    return 0;

  }

 

  if (location->lchild == NULL && location->rchild == NULL)

    case_a(parent, location);

  if (location->lchild != NULL && location->rchild == NULL)

    case_b(parent, location);

  if (location->lchild == NULL && location->rchild != NULL)

    case_b(parent, location);

  if (location->lchild != NULL && location->rchild != NULL)

    case_c(parent, location);

  free(location);

}

 

int preorder(struct node *ptr)

{

  if (root == NULL)

  {

    printf("Tree is empty");

    return 0;

  }

 

  if (ptr != NULL)

  {

    printf("%d  ", ptr->info);

    preorder(ptr->lchild);

    preorder(ptr->rchild);

  }

}

 

void inorder(struct node *ptr)

{

  if (root == NULL)

  {

    printf("Tree is empty");

    return;

  }

 

  if (ptr != NULL)

  {

    inorder(ptr->lchild);

    printf("%d  ", ptr->info);

    inorder(ptr->rchild);

  }

}

 

void postorder(struct node *ptr)

{

  if (root == NULL)

  {

    printf("Tree is empty");

    return;

  }

 

  if (ptr != NULL)

  {

    postorder(ptr->lchild);

    postorder(ptr->rchild);

    printf("%d  ", ptr->info);

  }

}

 

void display(struct node *ptr, int level)

{

  int i;

  if (ptr != NULL)

  {

    display(ptr->rchild, level + 1);

    printf("\n");

    for (i = 0; i < level; i++)

      printf("    ");

    printf("%d", ptr->info);

    display(ptr->lchild, level + 1);

  }

}

 

main()

{

  int choice, num;

  root = NULL;

  while (1)

  {

    printf("\n-------------------------------\n");

    printf("1.Insert\n");

    printf("2.Delete\n");

    printf("3.Inorder Traversal\n");

    printf("4.Preorder Traversal\n");

    printf("5.Postorder Traversal\n");

    printf("6.Display\n");

    printf("7.Quit\n");

    printf("Enter your choice : ");

    scanf("%d", &choice);

 

    switch (choice)

    {

      case 1:

        printf("Enter the number to be inserted : ");

        scanf("%d", &num);

        insert(num);

        break;

      case 2:

        printf("Enter the number to be deleted : ");

        scanf("%d", &num);

        del(num);

        break;

      case 3:

        inorder(root);

        break;

      case 4:

        preorder(root);

        break;

      case 5:

        postorder(root);

        break;

      case 6:

        display(root, 1);

        break;

      case 7:

        break;

      default:

        printf("Wrong choice\n");

    }

  }

}

Output



Comments

Popular posts from this blog

Computer Architecture and Organization - 4

Design and Analysis of Algorithms - 2

Design and Analysis of Algorithms - 6

Design and Analysis of Algorithms - 1

Artificial Intelligence - 7