Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4.  
  5. #include <string>
  6. #include <cstring>
  7.  
  8. using namespace std;
  9.  
  10. class Tree;
  11.  
  12. class TreeNode
  13. {
  14.     int x;
  15.     char z[10];
  16.  
  17.     TreeNode* left;
  18.     TreeNode* right;
  19.  
  20. public:
  21.     TreeNode(int);
  22.  
  23.     void display();
  24.     friend class Tree;
  25. };
  26.  
  27. class Tree
  28. {
  29.     TreeNode* root;
  30.     int size;
  31.  
  32. public:
  33.     Tree();
  34.     ~Tree();
  35.  
  36.     void addNode(int);
  37.     void fillsGoodInCorporation(int);
  38.  
  39.     TreeNode* search(int);
  40.  
  41.     TreeNode* findSuccessor(TreeNode*);
  42.     TreeNode* findParent(TreeNode*);
  43.  
  44.     void deleteNode(int);
  45.  
  46.     void preOrder(TreeNode*);
  47.     void inOrder(TreeNode*);
  48.     void postOrder(TreeNode*);
  49.  
  50.     void clear();
  51. };
  52.  
  53. TreeNode::TreeNode(int x)
  54. {
  55.     this->x = x;
  56.     strcpy(this->z, to_string(x).c_str());
  57.  
  58.     this->left = NULL;
  59.     this->right = NULL;
  60. }
  61.  
  62. void TreeNode::display()
  63. {
  64.     cout << x << " " << z << endl;
  65. }
  66.  
  67. Tree::Tree()
  68. {
  69.     this->root = NULL;
  70.     this->size = 0;
  71. }
  72.  
  73. Tree::~Tree()
  74. {
  75.     clear();
  76. }
  77.  
  78. void Tree::addNode(int x)
  79. {
  80.     if (root == NULL) {
  81.         root = new TreeNode(x);
  82.         size++;
  83.  
  84.         return;
  85.     }
  86.  
  87.     TreeNode* newNode = new TreeNode(x);
  88.     TreeNode* temp = root;
  89.  
  90.     while (temp) {
  91.         if (temp->x == x) {
  92.             delete newNode;
  93.             return;
  94.         }
  95.  
  96.         if (x < temp->x) {
  97.             if (temp->left == NULL) {
  98.                 temp->left = newNode;
  99.                 break;
  100.             }
  101.  
  102.             temp = temp->left;
  103.         } else {
  104.             if (temp->right == NULL) {
  105.                 temp->right = newNode;
  106.                 break;
  107.             }
  108.  
  109.             temp = temp->right;
  110.         }
  111.     }
  112.  
  113.     size++;
  114. }
  115.  
  116. void Tree::fillsGoodInCorporation(int X)
  117. {
  118.     for (int i = 0; i < X; i++) {
  119.         addNode(-10000 + rand() % 20001);
  120.     }
  121. }
  122.  
  123. TreeNode* Tree::search(int x)
  124. {
  125.     if (size == 0) {
  126.         cout << "Tree's empty!" << endl << endl;
  127.         return NULL;
  128.     }
  129.  
  130.     TreeNode* temp = root;
  131.     while (temp) {
  132.         if (temp->x == x) {
  133.             return temp;
  134.         }
  135.  
  136.         if (x < temp->x) {
  137.             temp = temp->left;
  138.         } else {
  139.             temp = temp->right;
  140.         }
  141.     }
  142.  
  143.     cout << "Not found bitch!" << endl << endl;
  144.     return NULL;
  145. }
  146.  
  147. TreeNode* Tree::findParent(TreeNode* node)
  148. {
  149.     TreeNode* temp = root;
  150.     while (temp) {
  151.         if (temp->left == node || temp->right == node) {
  152.             break;
  153.         }
  154.  
  155.         if (node->x < temp->x) {
  156.             temp = temp->left;
  157.         } else {
  158.             temp = temp->right;
  159.         }
  160.     }
  161.  
  162.     return temp;
  163. }
  164.  
  165. TreeNode* Tree::findSuccessor(TreeNode* node)
  166. {
  167.     TreeNode* temp = node->right;
  168.  
  169.     if (temp == NULL) {
  170.         return NULL;
  171.     }
  172.  
  173.     while (temp->left) {
  174.         temp = temp->left;
  175.     }
  176.  
  177.     return temp;
  178. }
  179.  
  180. void Tree::deleteNode(int x)
  181. {
  182.     if (size == 0) {
  183.         cout << "Tree's empty!";
  184.         return;
  185.     }
  186.  
  187.     if (size == 1 && root->x == x) {
  188.         delete root;
  189.  
  190.         root = NULL;
  191.         size--;
  192.  
  193.         return;
  194.     }
  195.  
  196.     TreeNode* parent = NULL;
  197.     TreeNode* toDelete = root;
  198.  
  199.     while (toDelete) {
  200.         if (toDelete->x == x) {
  201.             break;
  202.         }
  203.  
  204.         parent = toDelete;
  205.         if (x < toDelete->x) {
  206.             toDelete = toDelete->left;
  207.         } else {
  208.             toDelete = toDelete->right;
  209.         }
  210.     }
  211.  
  212.     if (toDelete == NULL) {
  213.         cout << "Not found!" << endl << endl;
  214.         return;
  215.     }
  216.  
  217.     if (root->x == x) {
  218.        
  219.     }
  220.  
  221.     if (toDelete->left == NULL && toDelete->right == NULL) {
  222.         if (parent->left == toDelete) {
  223.             parent->left = NULL;
  224.         } else {
  225.             parent->right = NULL;
  226.         }
  227.     } else if (toDelete->left == NULL) {
  228.         if (parent->left == toDelete) {
  229.             parent->left = toDelete->right;
  230.         } else {
  231.             parent->right = toDelete->right);
  232.         }
  233.     } else if (toDelete->right == NULL) {
  234.         if (parent->left == toDelete) {
  235.             parent->left = toDelete->left;
  236.         } else {
  237.             parent->right = toDelete->left;
  238.         }
  239.     } else {
  240.         TreeNode* successor = findSuccessor(toDelete);
  241.         TreeNode* successorParent = findParent(successor);
  242.         TreeNode* successorChild = successor->right;
  243.  
  244.         if (parent->left == toDelete) {
  245.             parent->left = successor;
  246.         } else {
  247.             parent->right = successor;
  248.         }
  249.  
  250.         successor->left = toDelete->left;
  251.         successor->right = toDelete->right;
  252.  
  253.         successorParent->left = successorChild;
  254.     }
  255.  
  256.     delete toDelete;
  257.     size--;
  258. }
  259.  
  260. void Tree::preOrder(TreeNode* node) {
  261.     int counter = 0;
  262.     if (node) {
  263.         node->display();
  264.         counter++;
  265.  
  266.         preOrder(node->left);
  267.         preOrder(node->right);
  268.     }
  269.  
  270.     cout << endl << "Total nodes: " << counter << endl << endl;
  271. }
  272.  
  273. void Tree::inOrder(TreeNode* node) {
  274.     int counter = 0;
  275.     if (node) {
  276.         inOrder(node->left);
  277.         node->display();
  278.         counter++;
  279.         inOrder(node->right);
  280.     }
  281.  
  282.     cout << endl << "Total nodes: " << counter << endl << endl;
  283. }
  284.  
  285. void Tree::postOrder(TreeNode* node) {
  286.     int counter = 0;
  287.     if (node) {
  288.         postOrder(node->left);
  289.         postOrder(node->right);
  290.         node->display();
  291.         counter++;
  292.     }
  293.  
  294.     cout << endl << "Total nodes: " << counter << endl << endl;
  295. }
  296.  
  297. int main()
  298. {
  299.     srand((unsigned) time(NULL));
  300.     cout << rand() << endl;
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement