Advertisement
Guest User

Untitled

a guest
Apr 25th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.75 KB | None | 0 0
  1. void deleteNode(node* root, int tempkey)
  2. {
  3. node* nodeRemove = findNode(tempkey, root);
  4. node* temp;
  5.  
  6. if (nodeRemove != NULL) // sprawdzam czy usuwany element istnieje
  7. {
  8. if (nodeRemove->left == NULL && nodeRemove->right == NULL) // sprawdzam czy usuwany element jest liściem
  9. {
  10. if (nodeRemove->key < nodeRemove->up->key) // jeśli element jest liściem z lewej strony
  11. {
  12. nodeRemove->up->left = NULL; // usuwam element
  13. nodeRemove = NULL;
  14. }
  15. else
  16. {
  17. nodeRemove->up->right = NULL; // w przeciwnym wypadku (element jest liściem z prawej strony) usuwam element
  18. nodeRemove = NULL;
  19. }
  20. }
  21.  
  22. else if (nodeRemove->left == NULL || nodeRemove->right == NULL) // sprawdzam czy usuwany element ma dziecko z lewej bądź prawej strony
  23. {
  24. if (nodeRemove->left != NULL) // jeśli element ma dziecko z lewej strony
  25. {
  26. temp = nodeRemove->left; // ustawiam temp na dziecko
  27. }
  28. else
  29. {
  30. temp = nodeRemove->right; // w przeciwnym wypadku (element ma dziecko z prawej strony) ustawiam temp na dziecko
  31. }
  32.  
  33. nodeRemove->key = temp->key; // ustawiam usuwany element na jego dziecko
  34. nodeRemove->left = temp->left;
  35. nodeRemove->right = temp->right;
  36. }
  37.  
  38. else
  39. { // ostatni warunek, czyli gdy element posiada dzieci po lewej i po prawej stronie
  40. A:
  41. int t; // daję wybór, który element (skrajnie prawy bądź skrajnie lewy) ma zastąpić usuwany element
  42. system("cls");
  43. cout << "Element ktory chcesz usunac ma oboje dzieci. Wybierz ktory element wstawiasz na miejsce usuwanego: " << endl;
  44. cout << "1. Skrajnie prawy z lewego poddrzewa" << endl;
  45. cout << "2. Skrajnie lewy z prawego poddrzewa" << endl << endl;
  46. cin >> t;
  47.  
  48. switch (t)
  49. {
  50. case 1: // przypadek, gdy element skrajnie prawy z lewego poddrzewa ma zastąpić usuwany element
  51. {
  52. temp = nodeRemove; // ustawiam temp na usuwany element
  53. temp = temp->left; // przechodzę do lewego poddrzewa
  54.  
  55. while (temp->right != NULL) // dopóki istnieje skrajny element po prawej stronie
  56. {
  57. temp = temp->right; // ustawiam tempa na skrajny element
  58. }
  59.  
  60. nodeRemove->key = temp->key; // zmieniam wartości usuwanego elementu na skrajnie prawy element
  61.  
  62. if (temp->right != NULL) // sprawdzam czy skrajnie prawy element ma dziecko z prawej strony
  63. {
  64. temp->key = temp->right->key; // jeśli tak, to ustawiam wartość jego dziecka na niego
  65. temp->right = NULL;
  66. }
  67.  
  68. else if (temp->left != NULL) // sprawdzam czy skrajnie prawy element ma dziecko z lewej strony
  69. {
  70. temp->key = temp->right->key; // jeśli tak, to ustawiam wartość jego dziecka na niego
  71. temp->left = NULL;
  72. }
  73.  
  74. else
  75. {
  76. temp->up->right = NULL; // jeśli skrajnie prawy element nie posiada dzieci, to go usuwam
  77. temp = NULL;
  78. }
  79.  
  80. break;
  81. }
  82.  
  83. case 2: // analogicznie jak case 1 tylko zastępowanym elementem jest element skrajnie lewy z prawego poddrzewa
  84. {
  85. temp = nodeRemove;
  86. temp = temp->right;
  87.  
  88. while (temp->left != NULL)
  89. {
  90. temp = temp->left;
  91. }
  92.  
  93. nodeRemove->key = temp->key;
  94.  
  95. if (temp->right != NULL)
  96. {
  97. temp->key = temp->right->key;
  98. temp->right = NULL;
  99. }
  100.  
  101. else if (temp->left != NULL)
  102. {
  103. temp->key = temp->right->key;
  104. temp->left = NULL;
  105. }
  106.  
  107. else
  108. {
  109. temp->up->left = NULL;
  110. temp = NULL;
  111.  
  112. }
  113.  
  114. break;
  115. }
  116.  
  117. default:
  118. {
  119. system("cls"); goto A;
  120. }
  121. }
  122.  
  123.  
  124. }
  125. }
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement