# include < conio.h > # include < process.h > # include < iostream.h > # include < alloc.h > struct node { int ele; node *left; node *right; }; typedef struct node *nodeptr; class stack { private: struct snode { nodeptr ele; snode *next; }; snode *top; public: stack() { top=NULL; } void push(nodeptr p) { snode *temp; temp = new snode; temp->ele = p; temp->next = top; top=temp; } void pop() { if (top != NULL) { nodeptr t; snode *temp; temp = top; top=temp->next; delete temp; } } nodeptr topele() { if (top !=NULL) return top->ele; else return NULL; } int isempty() { return ((top == NULL) ? 1 : 0); } }; class bstree { public: void insert(int,nodeptr &); void del(int,nodeptr &); int deletemin(nodeptr &); void find(int,nodeptr &); nodeptr findmin(nodeptr); nodeptr findmax(nodeptr); void copy(nodeptr &,nodeptr &); void makeempty(nodeptr &); nodeptr nodecopy(nodeptr &); void preorder(nodeptr); void inorder(nodeptr); void postorder(nodeptr); void preordernr(nodeptr); void inordernr(nodeptr); void postordernr(nodeptr); void leftchild(int,nodeptr &); void rightchild(int,nodeptr &); }; void bstree::insert(int x,nodeptr &p) { if (p==NULL) { p = new node; p->ele=x; p->left=NULL; p->right=NULL; } else { if (x < p->ele) insert(x,p->left); else if (x>p->ele) insert(x,p->right); else cout<<"Element already Exits !"; } } void bstree:: del(int x,nodeptr &p) { nodeptr d; if (p==NULL) cout<<"Element not found "; else if (x < p->ele) del(x,p->left); else if (x > p->ele) del(x,p->right); else if ((p->left == NULL) && (p->right ==NULL)) { d=p; free(d); p=NULL; } else if (p->left == NULL) { d=p; free(d); p=p->right; } else if (p->right ==NULL) { d=p; p=p->left; free(d); } else p->ele=deletemin(p->right); } int bstree::deletemin(nodeptr &p) { int c; if (p->left == NULL) { c=p->ele; p=p->right; return c; } else c=deletemin(p->left); return c; } void bstree::copy(nodeptr &p,nodeptr &p1) { makeempty(p1); p1=nodecopy(p); } void bstree::makeempty(nodeptr &p) { nodeptr d; if (p!=NULL) { makeempty(p->left); makeempty(p->right); d=p; free(d); p=NULL; } } nodeptr bstree::nodecopy(nodeptr &p) { nodeptr temp; if (p == NULL) return p; else { temp = new node; temp->ele=p->ele; temp->left = nodecopy(p->left); temp->right = nodecopy(p->right); return temp; } } nodeptr bstree::findmin(nodeptr p) { if (p==NULL) { cout<<"Tree is empty !"; return p; } else { while (p->left !=NULL) p=p->left; return p; } } nodeptr bstree::findmax(nodeptr p) { if (p==NULL) { cout<<"Tree is empty !"; return p; } else { while (p->right !=NULL) p=p->right; return p; } } void bstree::find(int x,nodeptr &p) { if (p==NULL) cout<<"Element not found !"; else { if (x < p->ele) find(x,p->left); else if ( x> p->ele) find(x,p->right); else cout<<"Element Found !"; } } void bstree::preorder(nodeptr p) { if (p!=NULL) { cout<< p->ele<<"-->"; preorder(p->left); preorder(p->right); } } void bstree::inorder(nodeptr p) { if (p!=NULL) { inorder(p->left); cout<< p->ele<<"-->"; inorder(p->right); } } void bstree::postorder(nodeptr p) { if (p!=NULL) { postorder(p->left); postorder(p->right); cout<< p->ele<<"-->"; } } void bstree::preordernr(nodeptr p) { stack s; while (1) { if (p != NULL) { cout<< p->ele<<"-->"; s.push(p); p=p->left; } else if (s.isempty()) { cout<<"Stack is empty"; return; } else { nodeptr t; t=s.topele(); p=t->right; s.pop(); } } } void bstree::inordernr(nodeptr p) { stack s; while (1) { if (p != NULL) { s.push(p); p=p->left; } else { if (s.isempty()) { cout<<"Stack is empty"; return; } else { p=s.topele(); cout<< p->ele<<"-->"; } s.pop(); p=p->right; } } } void bstree::postordernr(nodeptr p) { stack s; while (1) { if (p != NULL) { s.push(p); p=p->left; } else { if (s.isempty()) { cout<<"Stack is empty"; return; } else if (s.topele()->right == NULL) { p=s.topele(); s.pop(); cout<< p->ele<<"-->"; if (p==s.topele()->right) { cout<< s.topele()->ele<<"-->"; s.pop(); } } if (!s.isempty()) p=s.topele()->right; else p=NULL; } } } void bstree::leftchild(int q,nodeptr &p) { if (p==NULL) cout<<"The node does not exists "; else if (q < p->ele ) leftchild(q,p->left); else if (q > p->ele) leftchild(q,p->right); else if (q == p->ele) { if (p->left != NULL) cout<<"Left child of "<< q<<"is "<< p->left->ele; else cout<<"No Left child !"; } } void bstree::rightchild(int q,nodeptr &p) { if (p==NULL) cout<<"The node does not exists "; else if (q < p->ele ) rightchild(q,p->left); else if (q > p->ele) rightchild(q,p->right); else if (q == p->ele) { if (p->right != NULL) cout<<"Right child of "<< q<<"is "<< p->right->ele; else cout<<"No Right Child !"; } } int main() { int ch,x,leftele,rightele; bstree bst; char c='y'; nodeptr root,root1,min,max; root=NULL; root1=NULL; do { // system("clear"); clrscr(); cout<<"Binary Search Tree "; cout<<"-------------------------"; cout<<"1.Insertion 2.Deletion 3.NodeCopy"; cout<<"4.Find 5.Findmax 6.Findmin"; cout<<"7.Preorder 8.Inorder 9.Postorder"; cout<<"10.Leftchild 11.Rightchild 0.Exit"; cout<<"Enter your choice :"; cin>>ch; switch(ch) { case 1: cout<<"1.Insertion"; cout<<"Enter the new element to get inserted :"; cin>>x; bst.insert(x,root); cout<<"Inorder traversal is :"; bst.inorder(root); break; case 2: cout<<"2.Deletion"; cout<<"Enter the element to get deleted :"; cin>>x; bst.del(x,root); bst.inorder(root); break; case 3: cout<<"3.Nodecopy"; bst.copy(root,root1); cout<<"The new tree is :"; bst.inorder(root1); break; case 4: cout<<"4.Find"; cout<<"Enter the element to be searched :"; cin>>x; bst.find(x,root); break; case 5: cout<<"5.Findmax"; if (root == NULL) cout<<"Tree is empty"; else { max=bst.findmax(root); cout<<"Largest element is : "<< max->ele<< endl; } break; case 6: cout<<"6.Findmin"; if (root == NULL) cout<<"Tree is empty"; else { min=bst.findmin(root); cout<<"Smallest element is : "<< min->ele<< endl; } break; case 7: cout<<"7.Preorder"; if (root==NULL) cout<<"Tree is empty"; else { cout<<"Preorder traversal (Non-Recursive) is :"; bst.preordernr(root); cout<<"Preorder traversal (Recursive) is :"; bst.preorder(root); } break; case 8: cout<<"8.Inorder"; if (root==NULL) cout<<"Tree is empty"; else { cout<<"Inorder traversal (Non-Recursive) is :"; bst.inordernr(root); cout<<"Inorder traversal (Recursive) is :"; bst.inorder(root); } break; case 9: cout<<"9.Postorder"; if (root==NULL) cout<<"Tree is empty"; else { cout<<"Postorder traversal (Non-Recursive) is :"; bst.postordernr(root); cout<<"Postorder traversal (Recursive) is :"; bst.postorder(root); } break; case 10: cout<<"10.Finding the left Child "; if (root==NULL) cout<<"Tree is empty"; else { cout<<"Enter the node for which the left child is to be found :"; cin>>leftele; bst.leftchild(leftele,root); } break; case 11: cout<<"11.Finding the Right Child "; if (root==NULL) cout<<"Tree is empty"; else { cout<<"Enter the node for which the Right child is to be found :"; cin>>rightele; bst.rightchild(rightele,root); } break; case 0: exit(0); } cout<<"Continue (y/n) ?"; cin>>c; } while (c=='y' || c == 'Y'); return 0; }
Subscribe to:
Post Comments (Atom)
Post A Comment:
0 comments: