Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool Delete(int key){
- vector < Node* > stack=Find(this->root,key); //Tak btw to o ile istnieje: stack[ stack.size()-1 ] , jest to node do usuniecia,
- Node *tmp; //a o ile istnieje: stack[ stack.size()-2 ] , jest to jego parent node!
- if( !stack.size() ) //W drzewie nie ma noda z takim kluczem
- return false;
- if( !stack[ stack.size()-1 ]->left && !stack[ stack.size()-1 ]->right ) //Node do usuniecia nie ma potomkow
- if( stack.size() == 1 ){ //Node do usuniecia jest rootem
- delete this->root;
- this->root=NULL;
- }
- else{ //Node do usuniecia nie jest rootem
- if( stack[ stack.size()-2 ]->left == stack[ stack.size()-1 ] ) //Node do usuniecia jest lewym potomkiem swojego parent noda
- stack[ stack.size()-2 ]->left=NULL;
- else //Node do usuniecia jest prawym potomkiem swojego parent noda
- stack[ stack.size()-2 ]->right=NULL;
- delete stack[ stack.size()-1 ];
- }
- else if( !stack[ stack.size()-1 ]->left || !stack[ stack.size()-1 ]->left ){ //Node do usuniecia ma dokladnie jednego potomka
- if( stack[ stack.size()-1 ]->left ) //Ten potomek jest lewym
- tmp=stack[ stack.size()-1 ]->left;
- else //Ten potomek jest prawym
- tmp=stack[ stack.size()-1 ]->right;
- if( stack.size() == 1 ){ //Node do usuniecia jest rootem
- this->root=tmp;
- delete stack[ stack.size()-1 ];
- }
- else{ //Node do usuniecia nie jest rootem
- if( stack[ stack.size()-2 ]->left == stack[ stack.size()-1 ] ) //Node do usuniecia jest lewym potomkiem swojego parent noda
- stack[ stack.size()-2 ]->left=tmp;
- else //Node do usuniecia jest prawym potomkiem swojego parent noda
- stack[ stack.size()-2 ]->right=tmp;
- delete stack[ stack.size()-1 ];
- }
- }
- else{ //Node do usuniecia 2 potomkow
- Node *tmp_up=stack[ stack.size()-1 ];
- Node *tmp=tmp_up->left;
- while(tmp->right){ //tmp - najwiekszy element lewego poddrzewa, zastapi usunietego noda
- tmp_up=tmp; //tmp_up - parent node tmp
- tmp=tmp->right;
- }
- cout<<"\ntmp_up = "<<tmp_up->key<<"\ttmp = "<<tmp->key<<"\tstack = "<<stack[ stack.size()-1 ]->key;
- if( stack.size() == 1 ){ //Node do usuniecia jest rootem
- if(tmp == tmp_up->left) //tmp jest lewym potomkiem tmp_up
- tmp_up->left=NULL;
- else //tmp jest prawym potomkiem tmp_up
- tmp_up->right=NULL;
- tmp->left=this->root->left;
- tmp->right=this->root->right;
- Node *tmp_root=this->root;
- this->root=tmp;
- delete tmp_root;
- }
- else{ //Node do usuniecia nie jest rootem
- if(tmp == tmp_up->left) //tmp jest lewym potomkiem tmp_up
- tmp_up->left=NULL;
- else //tmp jest prawym potomkiem tmp_up
- tmp_up->right=NULL;
- tmp->left=stack[ stack.size()-1 ]->left;
- tmp->right=stack[ stack.size()-1 ]->right;
- Node *tmp_root=stack[ stack.size()-1 ];
- this->root=tmp;
- delete tmp_root;
- }
- /*
- stack[ stack.size()-1 ]->key=tmp->key;
- if( tmp_up->left==tmp ) //tmp jest lewym potomkiem tmp_up
- stack[ stack.size()-1 ]->left=tmp->left;
- else //tmp jest prawym potomkiem tmp_up
- tmp_up->right=tmp->left;
- delete tmp;
- */
- }
- stack.clear();
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement