Program:
/* 1. Create BST of integers and implement following functions. -create() until user enters "STOP" -inser() -insertrec() -Inorder recursive Traversals -Postorder non-recursive traversal -count leaf nodes -count nodes with degree 1 -count nodes with degree 2 -delete a node -recursive findmin() -nonrecursive findmin() -recursive findmax() -recursive findleaf() */ #include<iostream> #include<string.h> #include<stdlib.h> using namespace std; class Node { public: int data; Node* left,*right; Node() { data=0; left=right=NULL; } Node(int x) { data=x; left=right=NULL; } }; class BSTree { Node *root; public: BSTree() { root = NULL; } Node* getRoot() { return root; } void create(); Node* insert_rec(Node*,char*); void inOrder_rec(Node*); int count0(Node*); int count1(Node*); int count2(Node*); void delete_(int); Node* delete_rec(Node*,int); Node* findmin(Node*); Node* findmax(Node*); Node* findleaf(Node*); }; void BSTree::create() { char x[100]; while(1) { cout<<"\n Enter Number to insert, enter STOP to stop:"; cin>>x; if(strcmp(x,"STOP") == 0) { break; } root = insert_rec(root,x); } } Node* BSTree::insert_rec(Node* t,char* x) { if( t == NULL) { t = new Node(atoi(x)); return t; } if(atoi(x) > t->data) { t->right = insert_rec(t->right,x); return t; } else if(atoi(x) < t->data) { t->left = insert_rec(t->left,x); return t; } else { cout<<"\n Value Already Present!"; return NULL; } } void BSTree::inOrder_rec(Node* t) { if(t != NULL) { inOrder_rec(t->left); cout<<t->data<<" "; inOrder_rec(t->right); } } int BSTree::count0(Node* t) { if(t == NULL) { return 0; } if(t->left == NULL && t->right == NULL) { return 1; } if(t->left == NULL) { return 0+count0(t->right); } if(t->right == NULL) { return 0+count0(t->left); } return 0+count0(t->left)+count0(t->right); } int BSTree::count1(Node* t) { if(t == NULL) { return 0; } if(t->left == NULL && t->right == NULL) { return 0; } if(t->left == NULL) { return 1+count1(t->right); } if(t->right == NULL) { return 1+count1(t->left); } return 0+count1(t->left)+count1(t->right); } int BSTree::count2(Node* t) { if(t == NULL) { return 0; } if(t->left == NULL && t->right == NULL) { return 0; } if(t->left == NULL) { return 0+count2(t->right); } if(t->right == NULL) { return 0+count2(t->left); } return 1+count2(t->left)+count2(t->right); } void BSTree::delete_(int x) { root = delete_rec(root,x); } Node* BSTree::delete_rec(Node* t,int x) { if(t == NULL) { cout<<"\n Data Not Found!"; return NULL; } if(x > t->data) { t->right = delete_rec(t->right,x); return t; } else if(x < t->data) { t->left = delete_rec(t->left, x); return t; } // Data Found // leaf node if(t->left == NULL && t->right == NULL) { delete t; cout<<"\n Data Deleted Successfully!"; return NULL; } // Node with 1 child if(t->left == NULL) { Node *p = t->right; delete t; cout<<"\n Data Deleted Successfully!"; return p; } if(t->right == NULL) { Node *p = t->left; delete t; cout<<"\n Data Deleted Successfully!"; return p; } // Node with 2 child Node*p = findleaf(t->right); t->data = p->data; t->right = delete_rec(t->right,p->data); return t; } Node* BSTree::findmin(Node* t) { if(t == NULL) { return NULL; } if(t->left == NULL) { return t; } return findmin(t->left); } Node* BSTree::findmax(Node* t) { if(t == NULL) { return NULL; } if(t->right == NULL) { return t; } return findmax(t->right); } Node* BSTree::findleaf(Node* t) { if(t == NULL) { return NULL; } if(t->left == NULL && t->right == NULL) { return t; } if(t->left != NULL) { Node *p = findleaf(t->left); return p; } else { Node *p = findleaf(t->right); return p; } } int main() { freopen("input.txt","r",stdin); BSTree t; t.create(); int x; Node *root = t.getRoot(); Node *p; cout<<"\n\n Displaying Data:"; t.inOrder_rec(root); cout<<"\n Leaf Node count:"<<t.count0(root); cout<<"\n Node with 1 Child count:"<<t.count1(root); cout<<"\n Node with 2 Child count:"<<t.count2(root); p = t.findmin(root); cout<<"\n Minimum:"<<p->data; p = t.findmax(root); cout<<"\n Maximum:"<<p->data; cout<<"\n\n Enter Element to de deleted:"; cin>>x; t.delete_(x); cout<<"\n\n Displaying Data after delete:"; t.inOrder_rec(root); return 0; }
Input File:
50 45 25 48 60 55 70 STOP 60
Output: