text: /*
   * bst.c
   *
   *  Created on: Nov 28, 2019
   *      Author: ramneet
   */
  #include <stdio.h>
  #include <stdlib.h>
  
  struct node {
     int data;
  
     struct node *leftChild;
     struct node *rightChild;
  };
  
  struct node *root = NULL;
  
  void addnode(int data) {
     struct node *tempNode = (struct node*) malloc(sizeof(struct node));
     struct node *current;
     struct node *parent;
  
     tempNode->data = data;
     tempNode->leftChild = NULL;
     tempNode->rightChild = NULL;
  
     //if tree is empty
     if(root == NULL) {
        root = tempNode;
     } else {
        current = root;
        parent = NULL;
  
        while(1) {
           parent = current;
  
           //go to left of the tree
           if(data < parent->data) {
              current = current->leftChild;
  
              //insert to the left
              if(current == NULL) {
                 parent->leftChild = tempNode;
                 return;
              }
           }  //go to right of the tree
           else {
              current = current->rightChild;
  
              //insert to the right
              if(current == NULL) {
                 parent->rightChild = tempNode;
                 return;
              }
           }
        }
     }
  }
  
  struct node* search(int data) {
     struct node *current = root;
     printf("Present elements: ");
  
     while(current->data != data) {
        if(current != NULL)
           printf("%d ",current->data);
  
        //go to left tree
        if(current->data > data) {
           current = current->leftChild;
        }
        //else go to right tree
        else {
           current = current->rightChild;
        }
  
        //not found
        if(current == NULL) {
           return NULL;
        }
     }
  
     return current;
  }
  
  void pre_order_traversal(struct node* root) {
     if(root != NULL) {
        printf("%d ",root->data);
        pre_order_traversal(root->leftChild);
        pre_order_traversal(root->rightChild);
     }
  }
  
  void inorder_traversal(struct node* root) {
     if(root != NULL) {
        inorder_traversal(root->leftChild);
        printf("%d ",root->data);
        inorder_traversal(root->rightChild);
     }
  }
  
  void post_order_traversal(struct node* root) {
     if(root != NULL) {
        post_order_traversal(root->leftChild);
        post_order_traversal(root->rightChild);
        printf("%d ", root->data);
     }
  }
  
  int main() {
     int i;
     int array[7] = { 11, 88, 33, 22, 11, 88, 77 };
  
     for(i = 0; i < 7; i++)
        addnode(array[i]);
  
     i = 31;
     struct node * temp = search(i);
  
     if(temp != NULL) {
        printf("[%d] Element found.", temp->data);
        printf("\n");
     }else {
        printf("[ x ] Element not found (%d).\n", i);
     }
  
     i = 15;
     temp = search(i);
  
     if(temp != NULL) {
        printf("[%d] Element found.", temp->data);
        printf("\n");
     }else {
        printf("[ x ] Element not found (%d).\n", i);
     }
  
     //printf("\nPreorder traversal: ");
     //pre_order_traversal(root);
  
     printf("\nInorder traversal: ");
     inorder_traversal(root);
  
     //printf("\nPost order traversal: ");
     //post_order_traversal(root);
  
     return 0;
  }
  
  
  
  