You are on page 1of 9

#include<iostream.h> #include<conio.

h> int ymax=0; class treap { public: int key,priority; treap *left,*right,*parent; treap() { key=priority=ymax=0; left=right=parent=NULL; } treap(int k,int p) { key=k; priority=p; left=right=parent=NULL; } void treapcheck(); void insert(int k,int p); void rem(int k); void treapify(); void display(int width,int offset,int y); int find(); static treap* misc(treap*); }; treap* treap::misc(treap *temp) { if(temp->key==7) return temp; else if(7<temp->key) return treap::misc(temp->left); else return treap::misc(temp->right); } treap tp; int treap::find() { if(parent->left==this) return 0; else return 1; } void treap::insert(int k,int p) { if(k<=key) { if(left!=NULL) left->insert(k,p); else { left=new treap(k,p); left->parent=this;

} } else { if(right!=NULL) right->insert(k,p); else { right=new treap(k,p); right->parent=this; } } } void treap::treapify() { gotoxy(39,100); cout<<"Treap call("<<key<<","<<priority<<") "; getch(); if(left==NULL) { if(right==NULL) {} else { right->treapify(); if(priority>=right->priority) {} else { treap *temp; if(find()) { if(right->left!=NULL) (right->left)->parent=this; parent->right=right; right->parent=parent; parent=right; } else { if(right->left!=NULL) (right->left)->parent=this; parent->left=right; right->parent=parent; parent=right; } temp=right; //use left as temporary holder right=right->left; temp->left=this; { clrscr(); (tp.left)->display(100,0,1); } { gotoxy(39,100); cout<<"Treap Rot("<<key<<","<<pr iority<<") ";

getch(); } this->treapify(); } } } else { left->treapify(); if(right==NULL) { if(priority>=left->priority) {} else { treap *temp; if(find()) { if(left->right!=NULL) (left->right)->parent=this; parent->right=left; left->parent=parent; parent=left; } else { if(left->right!=NULL) (left->right)->parent=this; parent->left=left; left->parent=parent; parent=left; } temp=left; //use right as temporary holder left=left->right; temp->right=this; { clrscr(); (tp.left)->display(100,0,1); } { gotoxy(39,100); cout<<"Treap Rot("<<key<<","<<pr iority<<") "; getch(); } this->treapify(); } } else { right->treapify(); treap *temp; if(priority>=left->priority) { if(priority>=right->priority) {} else {

if(find()) { if(right->left!=NULL) (right->left)->parent=th is; parent->right=right; right->parent=parent; parent=right; } else { if(right->left!=NULL) (right->left)->parent=th is; parent->left=right; right->parent=parent; parent=right; } temp=right->left; right->left=this; right=temp; { clrscr(); (tp.left)->display(100,0 ,1); } { gotoxy(39,100); cout<<"Treap Rot("<<key< <","<<priority<<") "; getch(); } this->treapify(); } } else { if(priority>=right->priority) { if(find()) { if(left->right!=NULL) (left->right)->parent=th is; parent->right=left; left->parent=parent; parent=left; } else { if(left->right!=NULL) (left->right)->parent=th is; parent->left=left; left->parent=parent; parent=left; } temp=left->right;

left->right=this; left=temp; { clrscr(); (tp.left)->display(100,0 ,1); } { gotoxy(39,100); cout<<"Treap Rot("<<key< <","<<priority<<") "; getch(); } this->treapify(); } else { treap *temp2; if(left->priority>=right->priori ty) { if(find()) { if(right->left!= NULL) (right->left)->p arent=this; if(left->right!= NULL) (left->right)->p arent=this; parent->right=le ft; left->parent=par ent; right->parent=le ft; parent=right; } else { if(right->left!= NULL) (right->left)->p arent=this; if(left->right!= NULL) (left->right)->p arent=this; parent->left=lef t; left->parent=par ent; right->parent=le ft; parent=right; } temp2=right->left; temp=left->right;

left->right=right; right->left=this; left=temp; right=temp2; { clrscr(); (tp.left)->displ ay(100,0,1); } { gotoxy(39,100); cout<<"Treap Rot ("<<key<<","<<priority<<") "; getch(); } parent->treapify(); } else { if(find()) { if(right->left!= NULL) (right->left)->p arent=this; if(left->right!= NULL) (left->right)->p arent=this; parent->right=ri ght; right->parent=pa rent; left->parent=rig ht; parent=left; } else { if(right->left!= NULL) (right->left)->p arent=this; if(left->right!= NULL) (left->right)->p arent=this; parent->left=rig ht; right->parent=pa rent; left->parent=rig ht; parent=left; } temp=left; temp2=right; left=left->right; right=right->left;

temp->right=this; temp2->left=temp; { clrscr(); (tp.left)->displ ay(100,0,1); } { gotoxy(39,100); cout<<"Treap Rot ("<<key<<","<<priority<<") "; getch(); } parent->treapify(); } } } } } gotoxy(39,100); cout<<"Treap end("<<key<<","<<priority<<") "; getch(); } void treap::display(int width,int offset,int y) { int i,w=width/2,x=0; for(i=0;i<offset+w;i++) x++; gotoxy(x,y); cout<<key<<","<<priority; if(left!=NULL) left->display(w,offset,y+2); if(right!=NULL) right->display(w,offset+w,y+2); if(ymax<y) ymax=y; gotoxy(1,ymax+2); } void treap::treapcheck() { if(left!=NULL && right!=NULL) { if(key < left->key key > right->key) { cout<<"\nKey property violation\n"<<"key:"<<key<<"\nprio rity:"<<priority; cout<<"\n\nLeft child\n"<<"key:"<<left->key<<"\npriority :"<<left->priority; cout<<"\n\nRight child\n"<<"key:"<<right->key<<"\npriori ty:"<<right->priority; } if(priority < left->priority priority < right->priority) { cout<<"\nPriority property violation\n"<<"key:"<<key<<"\ npriority:"<<priority; cout<<"\n\nLeft child\n"<<"key:"<<left->key<<"\npriority :"<<left->priority;

cout<<"\n\nRight child\n"<<"key:"<<right->key<<"\npriori ty:"<<right->priority; } } if(left!=NULL) left->treapcheck(); if(right!=NULL) right->treapcheck(); }

void treap::rem(int k) { if(key==k) { if(left==NULL) { if(right!=NULL) { right->parent=parent; if(find()) parent->right=right; else parent->left=right; //delete this; } else { if(find()) parent->right=NULL; else parent->left=NULL; //delete } } else if(right==NULL) { left->parent=parent; if(find()) parent->right=left; else parent->left=left; //delete this; } else { if(left->priority >right->priority) { treap *temp=left; left->parent=parent; if(find()) parent->right=left; else parent->left=left; while(temp->right!=NULL) temp=temp->right; temp->right=right; right->parent=temp; left->treapify();

//delete this; } else { treap *temp=right; right->parent=parent; if(find()) parent->right=right; else parent->left=right; while(temp->left!=NULL) temp=temp->left; temp->left=left; left->parent=temp; right->treapify(); //delete this; } } } else if(k <= key) { if(left!=NULL) left->rem(k); else cout<<"Key not found!!"; } else { if(right!=NULL) right->rem(k); else cout<<"Key not found!!!!"; } }

You might also like