Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<string>
- using namespace std;
- typedef struct wezelek{string slowo;
- int wysokosc;
- struct wezelek *left,*right,*parent;}X;
- class Wierzba{
- public:
- Wierzba(){a.root=NULL;}
- int wyw2 (X* ble){
- if(!ble->left&&!ble->right)return 0;
- if(!ble->right)return 1;
- if(!ble->left)return -1;
- else return ble->left->wysokosc-ble->right->wysokosc;
- }
- /////////ROT1LEFT
- void rot1l(X*dziecie,X*rodzic){
- X * gdzies,*gdziesindziej;
- gdzies=dziecie->left;
- gdziesindziej=rodzic->parent;
- dziecie->left=rodzic;
- rodzic->parent=dziecie;
- rodzic->right=gdzies;
- if(gdzies!=NULL)gdzies->parent=rodzic;
- dziecie->parent=gdziesindziej;
- if(gdziesindziej!=NULL) {
- if(gdziesindziej->right == rodzic)
- gdziesindziej->right=dziecie;
- else
- gdziesindziej->left=dziecie;
- }
- if(a.root==rodzic)a.root=dziecie;
- rodzic->wysokosc=dziecie->wysokosc=0;
- }
- /////////ROT1RIGHT
- void rot1p(X*dziecie,X*rodzic){
- X* gdzies,*gdziesindziej;
- gdzies=dziecie->right;
- gdziesindziej=rodzic->parent;
- dziecie->right=rodzic;
- rodzic->parent=dziecie;
- rodzic->left=gdzies;
- if(gdzies!=NULL){gdzies->parent=rodzic;}
- dziecie->parent=gdziesindziej;
- if(gdziesindziej!=NULL) {
- if(gdziesindziej->right == rodzic)
- gdziesindziej->right=dziecie;
- else
- gdziesindziej->left=dziecie;
- }
- if(a.root==rodzic)a.root=dziecie;
- rodzic->wysokosc=dziecie->wysokosc=0;
- }
- ////////////ROT2LEFT
- void rot2l(X* rodzic,X*dziecie,X*senior){
- X *gdziesindziej,*gdziesleft,*gdziesright;
- int cos=dziecie->wysokosc;
- gdziesindziej=senior->parent;
- gdziesleft=dziecie->left;
- gdziesright=dziecie->right;
- dziecie->left=senior;
- senior->parent=dziecie;
- dziecie->right=rodzic;
- rodzic->parent=dziecie;
- rodzic->left=gdziesright;
- if(gdziesright!=NULL)gdziesright->parent=rodzic;
- senior->right=gdziesleft;
- if(gdziesleft!=NULL)gdziesleft->parent=senior;
- dziecie->parent=gdziesindziej;
- if(gdziesindziej!=NULL) {
- if(gdziesindziej->right == senior)
- gdziesindziej->right=dziecie;
- else
- gdziesindziej->left=dziecie;
- }
- if (a.root==senior) a.root=dziecie;
- if(dziecie->wysokosc==0){rodzic->wysokosc=0;senior->wysokosc=0;}
- else if(dziecie->wysokosc==-1){rodzic->wysokosc=0;senior->wysokosc=1;}
- else {rodzic->wysokosc=-1;senior->wysokosc=0;}
- dziecie->wysokosc=0;
- }
- ///////////ROT2RIGHT
- void rot2p(X* rodzic,X*dziecie,X*senior){
- X *gdziesindziej,*gdziesleft,*gdziesright;
- gdziesindziej=senior->parent;
- gdziesleft=dziecie->left;
- gdziesright=dziecie->right;
- dziecie->left=rodzic;
- rodzic->parent=dziecie;
- dziecie->right=senior;
- senior->parent=dziecie;
- rodzic->right=gdziesleft;
- if(gdziesleft!=NULL)gdziesleft->parent=rodzic;
- senior->left=gdziesright;
- if(gdziesright!=NULL)gdziesright->parent=senior;
- dziecie->parent=gdziesindziej;
- if(gdziesindziej!=NULL) {
- if(gdziesindziej->right == senior)
- gdziesindziej->right=dziecie;
- else
- gdziesindziej->left=dziecie;
- }
- if (a.root==senior) a.root=dziecie;
- if(dziecie->wysokosc==0){rodzic->wysokosc=0;senior->wysokosc=0;}
- else if(dziecie->wysokosc==-1){rodzic->wysokosc=1;senior->wysokosc=0;}
- else {rodzic->wysokosc=0;senior->wysokosc=-1;}
- dziecie->wysokosc=0;
- }
- //////DODAWNIE
- void dodajble(string dodawany,X*nowy){
- if (szukaj(dodawany)){}
- else {
- dodaj(dodawany,nowy);
- if(nowy==a.root){
- szukaj(dodawany);
- X*tmp=aktualny;
- do {
- if(tmp->parent==NULL)
- break;
- if(tmp->parent->left!=NULL && tmp->parent->left->slowo==tmp->slowo){
- tmp=tmp->parent;
- tmp->wysokosc++;
- if (tmp->wysokosc==0) {
- break;
- }
- else if(tmp->wysokosc==2&&tmp->left->wysokosc==1){
- rot1p(tmp->left,tmp);
- break;
- }
- else {
- if(tmp->wysokosc==2&&tmp->left!=NULL&&tmp->left->wysokosc==-1){
- rot2p(tmp->left,tmp->left->right,tmp);
- break;
- }
- }
- }
- else if(tmp->parent->right->slowo==tmp->slowo){
- tmp=tmp->parent;
- tmp->wysokosc--;
- if(tmp->wysokosc==0){
- break;
- }
- else if (tmp->wysokosc==-2&&tmp->right->wysokosc==-1){
- rot1l(tmp->right,tmp);break;
- }
- else {
- if(tmp->wysokosc==-2&&tmp->right!=NULL&&tmp->right->wysokosc==1){
- rot2l(tmp->right,tmp->right->left,tmp);
- break;
- }
- }
- }
- }
- while(tmp->parent!=NULL);
- }
- }
- }
- //trzeba wywolac z korzeniem
- void dodaj(string dodawany,X *nowy){
- if (a.root==NULL){
- nowy=new X;
- nowy->slowo=dodawany;
- nowy->left=NULL;
- nowy->right=NULL;
- nowy->wysokosc=0;
- a.root=nowy;
- (a.root)->left=(a.root)->right=(a.root)->parent=NULL;
- }
- else{
- if(nowy==NULL){
- nowy=new X;
- nowy->slowo=dodawany;
- nowy->left=NULL;
- nowy->right=NULL;
- nowy->wysokosc=0;
- nowy->parent=aktualny;
- if(aktualny!=NULL){
- if(aktualny->slowo>nowy->slowo) aktualny->left=nowy;
- else aktualny->right=nowy;
- }
- }
- else{
- if(dodawany<nowy->slowo){
- dodaj(dodawany,nowy->left);
- }
- else {
- dodaj(dodawany,nowy->right);
- }
- }
- }
- }
- //////////////USUNBLE
- void usunble(string usuwany,X* stary){
- if(!szukaj(usuwany)){}
- else{X* tmp=aktualny,*potem;
- potem=usun(a.root,tmp);
- // potem->parent=potem->right=potem->left=NULL;
- potem=NULL;
- delete potem;
- }
- }
- /////USUWANIE
- X * usun(X*korzen,X*stary){
- X*raz=stary->parent,*dwa;
- bool wywazac;
- if((stary->left)&&(stary->right))
- {
- wywazac=false;
- dwa=usun(korzen,pred(stary));
- dwa->left=stary->left;
- if(dwa->left) dwa->left->parent=dwa;
- dwa->right=stary->right;
- if(dwa->right) dwa->right->parent=dwa;
- dwa->wysokosc=wyw(dwa);
- }
- else {dwa=(stary->left)?stary->left:stary->right;
- wywazac=true;
- }
- if(dwa) dwa->parent=raz;
- if(!raz) {korzen=dwa;
- a.root=dwa;
- }
- else {if(raz->left==stary) raz->left=dwa;
- else raz->right=dwa;
- }
- X*pomo;
- if(wywazac){
- if(raz) raz->wysokosc = wyw(raz);
- raz = stary->parent;
- while(raz){
- if(raz->wysokosc == 1 || raz->wysokosc == -1) break;
- else if (raz->wysokosc == 0) {
- raz = raz->parent;
- if(raz) raz->wysokosc = wyw(raz);
- }
- else{
- //rotejszyns
- if(raz->wysokosc == 2){
- if(raz->left){
- if (raz->left->wysokosc == 1 || raz->left->wysokosc == 0) {
- rot1p(raz->left,raz);
- }
- else {
- rot2p(raz->left,raz->left->right,raz);
- }
- }
- }
- else {
- if (raz->wysokosc == -2){
- if (raz->right){
- if(raz->right->wysokosc == -1 || raz->right->wysokosc == 0) {
- rot1l(raz->right,raz);
- }
- else {
- rot2l(raz->right,raz->right->left,raz);
- }
- }
- }
- }
- raz = raz->parent;
- if(raz) raz->wysokosc=wyw(raz);
- }
- }
- }
- return stary;
- }
- int wyw(X * dow){
- if (!dow->left&&!dow->right) return 0;
- if (dow->left==NULL)return dow->wysokosc-1;
- else if(dow->right==NULL) return dow->wysokosc+1;
- else return dow->left->wysokosc-dow->right->wysokosc;
- }
- X * min(X *wezelek){
- X *x=wezelek;
- while(x->left) x=x->left;
- return x;
- }
- X *succ(X *x){
- if(x->right) return min(x->right);
- X *y;
- do{y=x;
- x=x->parent;}while (x&&(x->left!=y));
- return x;
- }
- X * max(X *wezelek){
- X *x=wezelek;
- while(x->right) x=x->right;
- return x;
- }
- X *pred(X *x){
- if(x->left) return max(x->left);
- X *y;
- do{y=x;
- x=x->parent;}while (x&&(x->right!=y));
- return x;
- }
- void przejdzin(X *wezelek, int d){
- if(a.root==NULL)cout<<"pusto";
- else {
- if(wezelek->left!=NULL) przejdzin(wezelek->left, d+1);
- for(int i = 0; i < d; ++i)
- cout << " ";
- cout<<wezelek->slowo<<" "<<wezelek->wysokosc<<endl;
- if (wezelek->right!=NULL) przejdzin(wezelek->right, d+1);
- }
- }
- bool szukaj(string szukany){
- X *wezelek=a.root;
- bool jest=false;
- while(wezelek!=NULL){
- if(wezelek->slowo==szukany) {jest=true;
- aktualny=wezelek;break;}
- else {
- if(wezelek->slowo<szukany) {aktualny=wezelek;wezelek=wezelek->right;}
- else {aktualny=wezelek;wezelek=wezelek->left;}
- }
- }
- return jest;}
- X* getroot(){return a.root;}
- X* getaktualny(){return aktualny;}
- private:
- X *aktualny;
- bool wywazac;
- typedef struct{X *root;}INFO;
- INFO a;
- };
- int main(){
- Wierzba Avl;
- string jakistam;
- int wybor=0;
- while(wybor!=4){
- cin>>wybor;
- switch(wybor){
- case 1:{
- cin>>jakistam;
- Avl.dodajble(jakistam,Avl.getroot());
- break;}
- case 2:{
- cin>>jakistam;
- if(Avl.szukaj(jakistam)) cout<<"SI"<<endl;else cout<<"NO"<<endl;
- break;}
- case 3:{
- cin>>jakistam;
- Avl.usunble(jakistam,Avl.getroot());
- break;}
- case 5: {Avl.przejdzin(Avl.getroot(), 0);
- cout << endl;
- break;}
- }
- }
- return 0;}
Add Comment
Please, Sign In to add comment