Advertisement
Guest User

Untitled

a guest
Dec 11th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <cstdlib>
  5. #include <ctime>
  6. #include <time.h>
  7. #include <fstream>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <windows.h>
  11. #include <string>
  12. using namespace std;
  13.  
  14. class Node
  15. {
  16. private:
  17. int key;
  18. int balance;
  19. Node* left;
  20. Node* right;
  21. string sign;
  22. int height;
  23.  
  24. public:
  25. Node(const int key) : key(key), balance(0), height(0)
  26. {
  27. left = nullptr;
  28. right = nullptr;
  29. sign = to_string(key);
  30. }
  31.  
  32. ~Node()
  33. {
  34. if (left) delete left;
  35. if (right) delete right;
  36. }
  37.  
  38. const int getKey() { return key; }
  39. Node* getLeft() { return left; }
  40. Node* getRight() { return this->right; }
  41. string getSign() { return this->sign; }
  42. int getBalance() { return balance; }
  43. int getHeight() { return height; }
  44.  
  45. void setLeft(Node* node) {
  46. this->left = node;
  47. }
  48.  
  49. void setRight(Node* node) {
  50. this->right = node;
  51. }
  52.  
  53. void setBalance(int newBalance) {
  54. this->balance = newBalance;
  55. }
  56.  
  57. void setHeight(int newHeight) {
  58. this->height = newHeight;
  59. }
  60.  
  61. };
  62.  
  63. class Tree
  64. {
  65. private:
  66. Node* root;
  67.  
  68. int getHeight(Node* node) {
  69. int lsize = 0;
  70. int rsize = 0;
  71.  
  72. if (node == nullptr) {
  73. return 0;
  74. }
  75. if (node->getLeft() != nullptr) {
  76. lsize = getHeight(node->getLeft()) + 1;
  77. }
  78. if (node->getRight() != nullptr) {
  79. rsize = getHeight(node->getRight()) + 1;
  80. }
  81.  
  82. return (lsize >= rsize ? lsize : rsize);
  83. }
  84.  
  85. bool isNodeLeaf(Node* node) {
  86. if (node->getLeft() == nullptr && node->getRight() == nullptr) return true;
  87. else return false;
  88. }
  89.  
  90. bool isChildSmaller(Node* nodeChild, Node* nodeParent) {
  91. if (nodeChild->getKey() > nodeParent->getKey())
  92. {
  93. return false;
  94. }
  95. return true;
  96. }
  97.  
  98. void balanceCalulate(Node* node = nullptr) {
  99. static int i = 0;
  100. if (node == nullptr) {
  101. balanceCalulate(this->root);
  102. }
  103. else {
  104. int leftHeight = 0;
  105. int rightHeight = 0;
  106.  
  107. if (node->getLeft() != nullptr) {
  108. leftHeight = getHeight(node->getLeft()) + 1;
  109. balanceCalulate(node->getLeft());
  110. }
  111.  
  112. if (node->getRight() != nullptr) {
  113. rightHeight = getHeight(node->getRight()) + 1;
  114. balanceCalulate(node->getRight());
  115. }
  116.  
  117. int newBalance = rightHeight - leftHeight;
  118. if (newBalance < -1)
  119. {
  120. leftRotation(node->getLeft());
  121. rightRotation(node);
  122. balanceCalulate(node);
  123. }
  124. else if (newBalance > 1)
  125. {
  126. rightRotation(node->getRight());
  127. leftRotation(node);
  128. balanceCalulate(node);
  129. }
  130. else
  131. {
  132. node->setBalance(newBalance);
  133. }
  134. }
  135. }
  136.  
  137. void leftRotation(Node* nodeToRotate) {
  138. Node* child = nodeToRotate->getRight();
  139.  
  140. if (child != nullptr) {
  141. nodeToRotate->setRight(child->getLeft());
  142. child->setLeft(nodeToRotate);
  143.  
  144. vector<Node*> nodeToRotateFamilly = searchNodeList(nodeToRotate->getKey());
  145.  
  146. if (nodeToRotateFamilly.size() >= 2) {
  147.  
  148. Node* nodeToRotateParent = nodeToRotateFamilly.at(nodeToRotateFamilly.size() - 2);
  149. if (isChildSmaller(nodeToRotate, nodeToRotateParent)) {
  150. nodeToRotateParent->setLeft(child);
  151. }
  152.  
  153. else {
  154. nodeToRotateParent->setRight(child);
  155. }
  156. }
  157.  
  158. if (nodeToRotate == root)
  159. {
  160. root = child;
  161. }
  162. }
  163. }
  164. void rightRotation(Node * nodeToRotate) {
  165. Node* child = nodeToRotate->getLeft();
  166. if (child != nullptr) {
  167. nodeToRotate->setLeft(child->getRight());
  168. child->setRight(nodeToRotate);
  169.  
  170. vector<Node*> nodeToRotateFamilly = searchNodeList(nodeToRotate->getKey());
  171. if (nodeToRotateFamilly.size() >= 2)
  172. {
  173. Node* nodeToRotateParent = nodeToRotateFamilly.at(nodeToRotateFamilly.size() - 2);
  174. if (isChildSmaller(nodeToRotate, nodeToRotateParent))
  175. {
  176. nodeToRotateParent->setLeft(child);
  177. }
  178. else
  179. {
  180. nodeToRotateParent->setRight(child);
  181. }
  182. }
  183.  
  184. if (nodeToRotate == root)
  185. {
  186. this->root = child;
  187. }
  188. }
  189. }
  190.  
  191. public:
  192. Tree(Node* root = 0)
  193. {
  194. this->root = root;
  195. srand(time(0));
  196. }
  197.  
  198. ~Tree()
  199. {
  200. }
  201.  
  202. Node* getRoot() { return root; }
  203.  
  204. void addNode(Node* node) {
  205. if (root == nullptr) {
  206. this->root = node;
  207. }
  208. else
  209. {
  210. addAsChild(node, root);
  211. }
  212.  
  213. balanceCalulate();
  214. }
  215.  
  216. void addAsChild(Node* nodeChild, Node* nodeParent) {
  217. bool stopCon = false;
  218. while (!stopCon) {
  219. if (nodeParent->getKey() == nodeChild->getKey()) {
  220. cout << "Wezel o takim kluczu już istnieje." << endl;
  221. stopCon = true;
  222. }
  223. else if (isChildSmaller(nodeChild, nodeParent))
  224. {
  225. if (nodeParent->getLeft() == nullptr) {
  226. nodeParent->setLeft(nodeChild);
  227. stopCon = true;
  228. }
  229. else nodeParent = nodeParent->getLeft();
  230. }
  231. else {
  232. if (nodeParent->getRight() == nullptr) {
  233. nodeParent->setRight(nodeChild);
  234. stopCon = true;
  235. }
  236. else nodeParent = nodeParent->getRight();
  237.  
  238. }
  239. }
  240. }
  241.  
  242. void putNode(Node* node) {
  243. addNode(node);
  244. }
  245.  
  246. void putRandoms(int howMuch = 1000) {
  247. for (int i = 0; i < howMuch; i++)
  248. {
  249. const int key = (rand() % 20001) - 10000;
  250. Node* node = new Node(key);
  251.  
  252. addNode(node);
  253. }
  254. }
  255.  
  256. void delNode(const int key, Node* node = nullptr) {
  257. Node* nodeRoot = getRoot();
  258. vector<Node*> nodes = searchNodeList(key, nodeRoot);
  259. if (nodes.empty()) {
  260. cout << "Nie znaleziono wezla o kluczu: " << key << endl;
  261. return;
  262. }
  263.  
  264. Node* nodeToDelete = nodes.back();
  265. Node* nodeToDelParent = nullptr;
  266. if (nodes.size() >= 2)
  267. {
  268. nodeToDelParent = nodes.at(nodes.size() - 2);
  269. }
  270.  
  271. if (isNodeLeaf(nodeToDelete))
  272. {
  273. if (nodeToDelParent != nullptr)
  274. {
  275. // Jeżeli ma rodzica sprawdzam czy jest po jego lewej czy prawej stronie
  276. // i usuwam wskaźnik na usuwany element
  277. if (isChildSmaller(nodeRoot, nodeToDelParent))
  278. {
  279. nodeToDelParent->setLeft(nullptr);
  280. }
  281. else {
  282. nodeToDelParent->setRight(nullptr);
  283. }
  284. }
  285. }
  286. else
  287. {
  288. // Jest to węzeł poprzednik lub następnik
  289. Node* nodeToReplace = nullptr;
  290. vector<Node *> nodeToReplaceTrace;
  291.  
  292. if (nodeToDelete->getLeft() != nullptr)
  293. {
  294. nodeToReplace = getMaxNode(nodeToDelete->getLeft());
  295. nodeToReplaceTrace = searchNodeList(nodeToReplace->getKey());
  296.  
  297. Node* nodeToReplaceParent = nodeToReplaceTrace.at(nodeToReplaceTrace.size() - 2);
  298. if (nodeToReplaceParent != nodeToDelete)
  299. {
  300. nodeToReplaceParent->setRight(nodeToReplace->getLeft());
  301. nodeToReplace->setLeft(nodeToDelete->getLeft());
  302. }
  303. nodeToReplace->setRight(nodeToDelete->getRight());
  304. }
  305. else if (nodeToDelete->getRight() != nullptr)
  306. {
  307. nodeToReplace = getMinNode(nodeToDelete->getRight());
  308. nodeToReplaceTrace = searchNodeList(nodeToReplace->getKey());
  309.  
  310. Node* nodeToReplaceParent = nodeToReplaceTrace.at(nodeToReplaceTrace.size() - 2);
  311. if (nodeToReplaceParent != nodeToDelete)
  312. {
  313. nodeToReplaceParent->setLeft(nodeToReplace->getRight());
  314. nodeToReplace->setRight(nodeToDelete->getRight());
  315. }
  316. nodeToReplace->setLeft(nodeToDelete->getLeft());
  317. }
  318.  
  319. // Na koniec trzeba rodzicowi zmienić wskaźnik z usuniętego potomka na nowy
  320. if (nodeToDelParent != nullptr)
  321. {
  322. if (isChildSmaller(nodeToDelete, nodeToDelParent))
  323. {
  324. nodeToDelParent->setLeft(nodeToReplace);
  325. }
  326. else
  327. {
  328. nodeToDelParent->setRight(nodeToReplace);
  329. }
  330. }
  331. // Trzeba sprawdzić również czy nodeToDel to korzeń
  332. if (nodeToDelete == root)
  333. {
  334. this->root = nodeToReplace;
  335. }
  336.  
  337. }
  338.  
  339. // Na koniec usuwamy węzeł
  340. nodeToDelete->setLeft(0);
  341. nodeToDelete->setRight(0);
  342. delete nodeToDelete;
  343.  
  344. // i liczymi współczynniki wyważenia
  345. balanceCalulate();
  346. }
  347.  
  348. void showInOrder(Node* node = 0) {
  349. static int i = 0;
  350. if (node == NULL) {
  351. showInOrder(this->root);
  352. }
  353. else {
  354. if (node->getLeft() != nullptr)
  355. {
  356. showInOrder(node->getLeft());
  357. }
  358.  
  359. cout << "Klucz: " << node->getKey() << " Tablica: " << node->getSign()
  360. << " Wsp. wywazenia: " << node->getBalance() << endl;
  361.  
  362. if (node->getRight() != nullptr) {
  363. showInOrder(node->getRight());
  364. }
  365. }
  366. }
  367. void showPreOrder(Node * node = 0) {
  368. static int i = 0;
  369. if (node == NULL) {
  370. showPreOrder(this->root);
  371. }
  372. else {
  373. cout << "Klucz: " << node->getKey() << " Tablica: " << node->getSign() << endl;
  374.  
  375. if (node->getLeft() != nullptr)
  376. {
  377. showPreOrder(node->getLeft());
  378. }
  379.  
  380. if (node->getRight() != nullptr) {
  381. showPreOrder(node->getRight());
  382. }
  383. }
  384. }
  385.  
  386. Node* getMinNode(Node * node) {
  387. while (node->getLeft() != nullptr)
  388. {
  389. node = node->getLeft();
  390. }
  391. return node;
  392. }
  393.  
  394. Node* getMaxNode(Node * node) {
  395. while (node->getRight() != nullptr)
  396. {
  397. node = node->getRight();
  398. }
  399. return node;
  400. }
  401.  
  402. Node* searchNode(const int key, Node* node = nullptr) {
  403. if (node == NULL) {
  404. searchNode(key, this->root);
  405. }
  406. else {
  407. while (true) {
  408. if (node == nullptr) {
  409. cout << "Cannot find " << key << endl;
  410. break;
  411. }
  412. else if (node->getKey() == key) {
  413. break;
  414. }
  415. else if (node->getKey() > key) {
  416. node = node->getLeft();
  417. }
  418. else if (node->getKey() < key) {
  419. node = node->getRight();
  420. }
  421. }
  422. return node;
  423. }
  424. }
  425.  
  426. vector<Node*> searchNodeList(const int key, Node* node = nullptr) {
  427. vector<Node*> nodes;
  428. if (this->root == nullptr)
  429. {
  430. cout << "Drzewo puste, nie ma nawet korzenia";
  431. return nodes;
  432. }
  433.  
  434. if (node == nullptr) {
  435. nodes = searchNodeList(key, this->root);
  436. }
  437. else {
  438. while (true) {
  439. if (node == nullptr) {
  440. cout << "Cannot find " << key << endl;
  441. nodes.clear();
  442. break;
  443. }
  444. else if (node->getKey() == key) {
  445. nodes.push_back(node);
  446. break;
  447. }
  448. else if (node->getKey() > key) {
  449. nodes.push_back(node);
  450. node = node->getLeft();
  451. }
  452. else if (node->getKey() < key) {
  453. nodes.push_back(node);
  454. node = node->getRight();
  455. }
  456. }
  457. }
  458. return nodes;
  459. }
  460. };
  461.  
  462. int main() {
  463. int X, k1, k2, k3, k4;
  464.  
  465. fstream plik;
  466. plik.open("inlab04.txt");
  467.  
  468. if (plik.good() == false) {
  469. cout << "Nie mozna otworzyc pliku!\n";
  470. }
  471. else
  472. {
  473. plik >> X;
  474. plik >> k1;
  475. plik >> k2;
  476. plik >> k3;
  477. plik >> k4;
  478.  
  479.  
  480. cout << X << " " << k1 << " " << k2 << " " << k3 << " " << k4 << endl;
  481. }
  482.  
  483.  
  484. plik.close();
  485.  
  486. srand(time(NULL));
  487.  
  488. clock_t begin, end;
  489. double time_spent;
  490. begin = clock();
  491.  
  492. Tree avl;
  493.  
  494. avl.delNode(k1);
  495. /*avl.addNode(k1);*/
  496. avl.putRandoms(X);
  497. avl.showInOrder(avl.getRoot());
  498. avl.showPreOrder(avl.getRoot());
  499. /*avl.addNode(k2);*/
  500. avl.showInOrder(avl.getRoot());
  501. /*avl.addNode(k3);
  502. avl.addNode(k4);*/
  503. avl.delNode(k1);
  504. avl.showPreOrder(avl.getRoot());
  505. avl.searchNode(k1);
  506. avl.showInOrder(avl.getRoot());
  507. avl.delNode(k3);
  508. avl.delNode(k4);
  509.  
  510. end = clock();
  511. time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
  512. cout << endl << time_spent << endl;
  513.  
  514. system("pause");
  515. return 0;
  516. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement