Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <string>
  4. #include <cstdlib>
  5. #include <ctime>
  6.  
  7.  
  8. using namespace std;
  9.  
  10. struct drzewo
  11. {
  12. drzewo *left, *right, *up;
  13. int data_urodzenia;
  14. string imie;
  15. };
  16.  
  17.  
  18. void dodaj_wartosc(drzewo *&root, string x, int y)
  19. {
  20. drzewo *w, *p;
  21.  
  22. w = new drzewo;
  23. w->right = NULL;
  24. w->left = NULL;
  25. w->imie = x;
  26. w->data_urodzenia = y;
  27. p = root;
  28.  
  29. if (!p)
  30. {
  31. root=w;
  32. }
  33. else
  34. {
  35. while (true)
  36. {
  37. if (y < p->data_urodzenia)
  38. {
  39. if (!p->left)
  40. {
  41. p->left=w;
  42. break;
  43. }
  44. else
  45. {
  46. p = p->left;
  47. }
  48. }
  49. else
  50. {
  51. if (!p->right)
  52. {
  53. p->right=w;
  54. break;
  55. }
  56. else
  57. {
  58. p = p->right;
  59. }
  60. }
  61. }
  62. }
  63. w->up = p;
  64. }
  65.  
  66. void usun_drzewo(drzewo *v)
  67. {
  68. if (v)
  69. {
  70. usun_drzewo(v->left); // usuwamy lewe poddrzewo
  71. usun_drzewo(v->right); // usuwamy prawe poddrzewo
  72. delete v; // usuwamy sam węzeł
  73. }
  74. }
  75.  
  76. void drukuj_drzewo(drzewo *root, int odleglosc)
  77. {
  78. if (root)
  79. {
  80. drukuj_drzewo(root->right, odleglosc + 5);
  81. cout << setw(odleglosc) << root->data_urodzenia<< " "<< root->imie << endl;
  82. drukuj_drzewo(root->left, odleglosc + 5);
  83. }
  84. }
  85.  
  86. drzewo *najpozniej_urodzony(drzewo *p)
  87. {
  88. if (p) while (p->right) p = p->right;
  89.  
  90. return p ;
  91. }
  92.  
  93. drzewo *najwczesniej_urodzony(drzewo *p)
  94. {
  95. if (p) while (p->left) p = p->left;
  96.  
  97. return p;
  98. }
  99.  
  100. void wypisz(drzewo *x)
  101. {
  102. cout << x->imie << ", rocznik "<< x->data_urodzenia << endl;
  103. }
  104.  
  105. drzewo *nastepnik(drzewo * p)
  106. {
  107. drzewo * r;
  108.  
  109. if (p)
  110. {
  111. if (p->right) return najwczesniej_urodzony(p->right);
  112. else
  113. {
  114. r = p->up;
  115. while (r && (p == r->right))
  116. {
  117. p = r;
  118. r = r->up;
  119. }
  120. return r;
  121. }
  122. }
  123. return p;
  124. }
  125.  
  126. drzewo *szukaj(drzewo *p, int k)
  127. {
  128. while(p && p->data_urodzenia != k)
  129. p = (k < p->data_urodzenia)? p->left : p->right;
  130.  
  131. return p;
  132. }
  133.  
  134. void usun_dany_element(drzewo *&root, drzewo *X)
  135. {
  136. drzewo *Y, *Z;
  137.  
  138. if (X)
  139. {
  140. Y = !X->left || !X->right ? X : nastepnik(X);
  141.  
  142. Z = Y->left ? Y->left : Y->right;
  143.  
  144. if (Z) Z->up = Y->up;
  145.  
  146. if (!Y->up) root = Z;
  147. else if (Y == Y->up->left) Y->up->left = Z;
  148. else Y->up->right = Z;
  149.  
  150. if (Y != X)
  151. {
  152. X->data_urodzenia = Y->data_urodzenia;
  153. X->imie = Y->imie;
  154. }
  155. delete Y;
  156. }
  157. }
  158.  
  159. int main()
  160. {
  161. drzewo *head = NULL;
  162. drzewo *x, *d, *e, *a;
  163.  
  164. srand(time(NULL));
  165.  
  166. dodaj_wartosc(head, "syn", 1999);
  167. dodaj_wartosc(head, "mama", 1973);
  168. dodaj_wartosc(head, "tata", 1974);
  169. dodaj_wartosc(head, "babcia", 1952);
  170. dodaj_wartosc(head, "dziadek", 1942);
  171. dodaj_wartosc(head, "corka", 1996);
  172. dodaj_wartosc(head, "wnuk", 2009);
  173. dodaj_wartosc(head, "wnuczka", 2008);
  174. dodaj_wartosc(head, "pies", 2017);
  175.  
  176. drukuj_drzewo(head, 0);
  177. cout << endl;
  178. x = najpozniej_urodzony(head);
  179. d = najwczesniej_urodzony(head);
  180. cout << "Najstarszy czlonek rodziny to: "; wypisz(d);
  181. cout << "Najmlodszy czlonek rodziny to: "; wypisz(x);
  182. cout << endl;
  183. int q;
  184. cin >> q;
  185. a = szukaj(head, q);
  186. wypisz(a);
  187. cout << endl;
  188.  
  189. usun_dany_element(head, a);
  190. drukuj_drzewo(head, 0);
  191.  
  192. usun_drzewo(head);
  193. cin.get();
  194. return 0;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement