Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Experiment No.: 9 Implement Binary Search Tree ADT Using Linked List

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 18

EXPERIMENT NO.

: 9
Implement Binary Search Tree ADT using Linked
List.

NAME: HARSH KISHOR ALASHI

CLASS: SE COMPS

DIVISION: A

BATCH: A1

ROLL NO.: CEA304


AIM: Implement Binary Search Tree ADT using Linked List.

THEORY:

In the binary tree, each node can have at most two children. Each node can have zero, one or
two children. Each node in the binary tree contains the following information:

Data that represents value stored in the node.

 Left that represents the pointer to the left child.


 Right that represents the pointer to the right child.

The properties that separate a binary search tree from a regular binary tree is

 All nodes of left subtree are less than the root node
 All nodes of right subtree are more than the root node
 Both subtrees of each node are also BSTs i.e. they have the above two properties

A Binary Search Tree (BST) is a tree in which all the nodes follow the below-mentioned
properties −

The value of the key of the left sub-tree is less than the value of its parent (root) node's key.

The value of the key of the right sub-tree is greater than or equal to the value of its parent
(root) node's key.

Basic Operations

Following are the basic operations of a tree −

Search − Searches an element in a tree.


Insert − Inserts an element in a tree.

Pre-order Traversal − Traverses a tree in a pre-order manner.

In-order Traversal − Traverses a tree in an in-order manner.

Post-order Traversal − Traverses a tree in a post-order manner.

ALGORITHM:

1. Define Node class which has three attributes namely: data left and right. Here, left
represents the left child of the node and right represents the right child of the node.
2. When a node is created, data will pass to data attribute of the node and both left and
right will be set to null.
3. Define another class which has an attribute root.
4. Root represents the root node of the tree and initialize it to null.
5. insert() will add a new node to the tree:
6. It checks whether the root is null, which means the tree is empty. It will add the new
node as root.
7. Else, it will add root to the queue.
8. The variable node represents the current node.
9. First, it checks whether a node has a left and right child. If yes, it will add both nodes to
queue.
10.If the left child is not present, it will add the new node as the left child.
11.If the left is present, then it will add the new node as the right child.
12.Inorder() will display nodes of the tree in inorder fashion.
13.It traverses the entire tree then prints out left child followed by root then followed by
the right child.
PROGRAM:

#include <stdio.h>

#include <conio.h>

#include <malloc.h>

struct node

int data;

struct node *left;

struct node *right;

};

struct node *tree;

void create_tree(struct node *);

struct node *insertElement(struct node *, int);

void preorderTraversal(struct node *);

void inorderTraversal(struct node *);

void postorderTraversal(struct node *);

struct node *findSmallestElement(struct node *);

struct node *findLargestElement(struct node *);

struct node *deleteElement(struct node *, int);

struct node *mirrorImage(struct node *);

int totalNodes(struct node *);

int totalExternalNodes(struct node *);

int totalInternalNodes(struct node *);

int Height(struct node *);


struct node *deleteTree(struct node *);

int main()

int option, val;

struct node *ptr;

create_tree(tree);

clrscr();

do

printf("\n ******MAIN MENU******* \n");

printf("\n 1. Insert Element");

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

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

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

printf("\n 5. Find the smallest element");

printf("\n 6. Find the largest element");

printf("\n 7. Delete an element");

printf("\n 8. Count the total number of nodes");

printf("\n 9. Count the total number of external nodes");

printf("\n 10. Count the total number of internal nodes");

printf("\n 11. Determine the height of the tree");

printf("\n 12. Find the mirror image of the tree");

printf("\n 13. Delete the tree");

printf("\n 14. Exit");


printf("\n\n Enter your option : ");

scanf("%d", &option);

switch(option)

case 1:

printf("\n Enter the value of the new node : ");

scanf("%d", &val);

tree = insertElement(tree, val);

break;

case 2:

printf("\n The elements of the tree are : \n");

preorderTraversal(tree);

break;

case 3:

printf("\n The elements of the tree are : \n");

inorderTraversal(tree);

break;

case 4:

printf("\n The elements of the tree are : \n");

postorderTraversal(tree);

break;

case 5:
ptr = findSmallestElement(tree);

printf("\n Smallest element is :%d",ptr->data);

break;

case 6:

ptr = findLargestElement(tree);

printf("\n Largest element is : %d", ptr–>data);

break;

case 7:

printf("\n Enter the element to be deleted : ");

scanf("%d", &val);

tree = deleteElement(tree, val);

break;

case 8:

printf("\n Total no. of nodes = %d", totalNodes(tree));

break;

case 9:

printf("\n Total no. of external nodes = %d",

totalExternalNodes(tree));

break;

case 10:

printf("\n Total no. of internal nodes = %d",

totalInternalNodes(tree));

break;

case 11:
printf("\n The height of the tree = %d",Height(tree));

break;

case 12:

tree = mirrorImage(tree);

break;

case 13:

tree = deleteTree(tree);

break;

}while(option!=14);

getch();

return 0;

void create_tree(struct node *tree)

tree = NULL;

struct node *insertElement(struct node *tree, int val)

struct node *ptr, *nodeptr, *parentptr;

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

ptr–>data = val;

ptr–>left = NULL;
ptr–>right = NULL;

if(tree==NULL)

tree=ptr;

tree–>left=NULL;

tree–>right=NULL;

else

parentptr=NULL;

nodeptr=tree;

while(nodeptr!=NULL)

parentptr=nodeptr;

if(val<nodeptr–>data)

nodeptr=nodeptr–>left;

else

nodeptr = nodeptr–>right;

if(val<parentptr–>data)
parentptr–>left = ptr;

else

parentptr–>right = ptr;

return tree;

void preorderTraversal(struct node *tree)

if(tree != NULL)

printf("%d\t", tree–>data);

preorderTraversal(tree–>left);

preorderTraversal(tree–>right);

void inorderTraversal(struct node *tree)

if(tree != NULL)

inorderTraversal(tree->left);

printf("%d\t", tree->data);

inorderTraversal(tree->right);

}
}

void postorderTraversal(struct node *tree)

if(tree != NULL)

postorderTraversal(tree->left);

postorderTraversal(tree->right);

printf("%d\t", tree->data);

struct node *findSmallestElement(struct node *tree)

if( (tree == NULL) || (tree->left == NULL))

return tree;

else

return findSmallestElement(tree ->left);

struct node *findLargestElement(struct node *tree)

if( (tree == NULL) || (tree->right == NULL))

return tree;

else

return findLargestElement(tree->right);
}

struct node *deleteElement(struct node *tree, int val)

struct node *cur, *parent, *suc, *psuc, *ptr;

if(tree–>left==NULL)

printf("\n The tree is empty ");

return(tree);

parent = tree;

cur = tree–>left;

while(cur!=NULL && val!= cur–>data)

parent = cur;

cur = (val<cur–>data)? cur–>left:cur–>right;

if(cur == NULL)

printf("\n The value to be deleted is not present in the tree");

return(tree);

if(cur–>left == NULL)

ptr = cur–>right;
else if(cur–>right == NULL)

ptr = cur–>left;

else

// Find the in–order successor and its parent

psuc = cur;

cur = cur–>left;

while(suc–>left!=NULL)

psuc = suc;

suc = suc–>left;

if(cur==psuc)

// Situation 1

suc–>left = cur–>right;

}
else

// Situation 2

suc–>left = cur–>left;

psuc–>left = suc–>right;

suc–>right = cur–>right;

ptr = suc;

// Attach ptr to the parent node

if(parent–>left == cur)

parent–>left=ptr;

else

parent–>right=ptr;

free(cur);

return tree;

int totalNodes(struct node *tree)

if(tree==NULL)

return 0;

else
return(totalNodes(tree–>left) + totalNodes(tree–>right) + 1);

int totalExternalNodes(struct node *tree)

if(tree==NULL)

return 0;

else if((tree–>left==NULL) && (tree–>right==NULL))

return 1;

else

return (totalExternalNodes(tree–>left) +

totalExternalNodes(tree–>right));

int totalInternalNodes(struct node *tree)

if( (tree==NULL) || ((tree–>left==NULL) && (tree–>right==NULL)))

return 0;

else

return (totalInternalNodes(tree–>left)

+ totalInternalNodes(tree–>right) + 1);

int Height(struct node *tree)


{

int leftheight, rightheight;

if(tree==NULL)

return 0;

else

leftheight = Height(tree–>left);

rightheight = Height(tree–>right);

if(leftheight > rightheight)

return (leftheight + 1);

else

return (rightheight + 1);

struct node *mirrorImage(struct node *tree)

struct node *ptr;

if(tree!=NULL)

mirrorImage(tree–>left);

mirrorImage(tree–>right);

ptr=tree–>left;

ptr–>left = ptr–>right;
tree–>right = ptr;

struct node *deleteTree(struct node *tree)

if(tree!=NULL)

deleteTree(tree–>left);

deleteTree(tree–>right);

free(tree);

OUTPUT:
CONCLUSION:

Thus, we have successfully Binary Search Tree ADT using Linked list.

You might also like