Advertisement
ElooEminem

Untitled

Nov 28th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.14 KB | None | 0 0
  1. bool Delete(int key){
  2. vector < Node* > stack=Find(this->root,key); //Tak btw to o ile istnieje: stack[ stack.size()-1 ] , jest to node do usuniecia,
  3. Node *tmp; //a o ile istnieje: stack[ stack.size()-2 ] , jest to jego parent node!
  4. if( !stack.size() ) //W drzewie nie ma noda z takim kluczem
  5. return false;
  6. if( !stack[ stack.size()-1 ]->left && !stack[ stack.size()-1 ]->right ) //Node do usuniecia nie ma potomkow
  7. if( stack.size() == 1 ){ //Node do usuniecia jest rootem
  8. delete this->root;
  9. this->root=NULL;
  10. }
  11. else{ //Node do usuniecia nie jest rootem
  12. if( stack[ stack.size()-2 ]->left == stack[ stack.size()-1 ] ) //Node do usuniecia jest lewym potomkiem swojego parent noda
  13. stack[ stack.size()-2 ]->left=NULL;
  14. else //Node do usuniecia jest prawym potomkiem swojego parent noda
  15. stack[ stack.size()-2 ]->right=NULL;
  16. delete stack[ stack.size()-1 ];
  17. }
  18. else if( !stack[ stack.size()-1 ]->left || !stack[ stack.size()-1 ]->left ){ //Node do usuniecia ma dokladnie jednego potomka
  19. if( stack[ stack.size()-1 ]->left ) //Ten potomek jest lewym
  20. tmp=stack[ stack.size()-1 ]->left;
  21. else //Ten potomek jest prawym
  22. tmp=stack[ stack.size()-1 ]->right;
  23. if( stack.size() == 1 ){ //Node do usuniecia jest rootem
  24. this->root=tmp;
  25. delete stack[ stack.size()-1 ];
  26. }
  27. else{ //Node do usuniecia nie jest rootem
  28. if( stack[ stack.size()-2 ]->left == stack[ stack.size()-1 ] ) //Node do usuniecia jest lewym potomkiem swojego parent noda
  29. stack[ stack.size()-2 ]->left=tmp;
  30. else //Node do usuniecia jest prawym potomkiem swojego parent noda
  31. stack[ stack.size()-2 ]->right=tmp;
  32. delete stack[ stack.size()-1 ];
  33. }
  34. }
  35. else{ //Node do usuniecia 2 potomkow
  36.  
  37. Node *tmp_up=stack[ stack.size()-1 ];
  38. Node *tmp=tmp_up->left;
  39. while(tmp->right){ //tmp - najwiekszy element lewego poddrzewa, zastapi usunietego noda
  40. tmp_up=tmp; //tmp_up - parent node tmp
  41. tmp=tmp->right;
  42. }
  43. cout<<"\ntmp_up = "<<tmp_up->key<<"\ttmp = "<<tmp->key<<"\tstack = "<<stack[ stack.size()-1 ]->key;
  44.  
  45. if( stack.size() == 1 ){ //Node do usuniecia jest rootem
  46. if(tmp == tmp_up->left) //tmp jest lewym potomkiem tmp_up
  47. tmp_up->left=NULL;
  48. else //tmp jest prawym potomkiem tmp_up
  49. tmp_up->right=NULL;
  50. tmp->left=this->root->left;
  51. tmp->right=this->root->right;
  52. Node *tmp_root=this->root;
  53. this->root=tmp;
  54. delete tmp_root;
  55. }
  56. else{ //Node do usuniecia nie jest rootem
  57. if(tmp == tmp_up->left) //tmp jest lewym potomkiem tmp_up
  58. tmp_up->left=NULL;
  59. else //tmp jest prawym potomkiem tmp_up
  60. tmp_up->right=NULL;
  61. tmp->left=stack[ stack.size()-1 ]->left;
  62. tmp->right=stack[ stack.size()-1 ]->right;
  63. Node *tmp_root=stack[ stack.size()-1 ];
  64. this->root=tmp;
  65. delete tmp_root;
  66. }
  67. /*
  68. stack[ stack.size()-1 ]->key=tmp->key;
  69. if( tmp_up->left==tmp ) //tmp jest lewym potomkiem tmp_up
  70. stack[ stack.size()-1 ]->left=tmp->left;
  71. else //tmp jest prawym potomkiem tmp_up
  72. tmp_up->right=tmp->left;
  73. delete tmp;
  74. */
  75. }
  76. stack.clear();
  77. return true;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement