Advertisement
anticlown

Binary Tree example(3 sem.)

Oct 31st, 2023 (edited)
954
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <random>
  3. #include <queue>
  4.  
  5. int getRandomNumber(int min, int max) {
  6.     std::random_device rd;
  7.     std::mt19937 gen(rd());
  8.     std::uniform_int_distribution<int> dis(min, max);
  9.     return dis(gen);
  10. }
  11.  
  12. struct Trunk
  13. {
  14.     Trunk* prev;
  15.     std::string str;
  16.  
  17.     Trunk(Trunk* prev, std::string str)
  18.     {
  19.         this->prev = prev;
  20.         this->str = str;
  21.     }
  22. };
  23.  
  24. class Node {
  25. public:
  26.     int data;
  27.     Node* left;
  28.     Node* right;
  29.     Node* next;
  30.  
  31.     explicit Node(int value) {
  32.         data = value;
  33.         left = nullptr;
  34.         right = nullptr;
  35.         next = nullptr;
  36.     }
  37. };
  38.  
  39. class BinarySearchTree {
  40. private:
  41.     Node* root;
  42.  
  43.     Node* insertNode(Node* node, int value) {
  44.         if (node == nullptr) {
  45.             return new Node(value);
  46.         }
  47.  
  48.         if (value < node->data) {
  49.             node->left = insertNode(node->left, value);
  50.         }
  51.         else if (value > node->data) {
  52.             node->right = insertNode(node->right, value);
  53.         }
  54.  
  55.         return node;
  56.     }
  57.  
  58.     static Node* findMinNode(Node* node) {
  59.         while (node->left != nullptr) {
  60.             node = node->left;
  61.         }
  62.         return node;
  63.     }
  64.  
  65.     Node* deleteNode(Node* node, int value) {
  66.         if (node == nullptr) {
  67.             return nullptr;
  68.         }
  69.  
  70.         if (value < node->data) {
  71.             node->left = deleteNode(node->left, value);
  72.         }
  73.         else if (value > node->data) {
  74.             node->right = deleteNode(node->right, value);
  75.         }
  76.         else {
  77.             if (node->left == nullptr && node->right == nullptr) {
  78.                 delete node;
  79.                 node = nullptr;
  80.             }
  81.             else if (node->left == nullptr) {
  82.                 Node* temp = node;
  83.                 node = node->right;
  84.                 delete temp;
  85.             }
  86.             else if (node->right == nullptr) {
  87.                 Node* temp = node;
  88.                 node = node->left;
  89.                 delete temp;
  90.             }
  91.             else {
  92.                 Node* temp = findMinNode(node->right);
  93.                 node->data = temp->data;
  94.                 node->right = deleteNode(node->right, temp->data);
  95.             }
  96.         }
  97.  
  98.         return node;
  99.     }
  100.  
  101.     void inorderTraversal(Node* node) {
  102.         if (node != nullptr) {
  103.             inorderTraversal(node->left);
  104.             std::cout << node->data << " ";
  105.             inorderTraversal(node->right);
  106.         }
  107.     }
  108.  
  109.     void preorderTraversal(Node* node) {
  110.         if (node != nullptr) {
  111.             std::cout << node->data << " ";
  112.             preorderTraversal(node->left);
  113.             preorderTraversal(node->right);
  114.         }
  115.     }
  116.  
  117.     void postorderTraversal(Node* node) {
  118.         if (node != nullptr) {
  119.             postorderTraversal(node->left);
  120.             postorderTraversal(node->right);
  121.             std::cout << node->data << " ";
  122.         }
  123.     }
  124.  
  125.     void preorderTraversalFull(Node* node) {
  126.         if (node != nullptr) {
  127.             std::cout << node->data << " ";
  128.             if (node->left != nullptr) {
  129.                 preorderTraversalFull(node->left);
  130.             }
  131.             else {
  132.                 std::cout << "null ";
  133.             }
  134.             if (node->right != nullptr) {
  135.                 preorderTraversalFull(node->right);
  136.             }
  137.             else {
  138.                 std::cout << "null ";
  139.             }
  140.         }
  141.     }
  142.  
  143.     void inorderTraversalFull(Node* node) {
  144.         if (node != nullptr) {
  145.             if (node->left != nullptr) {
  146.                 inorderTraversalFull(node->left);
  147.             }
  148.             else {
  149.                 std::cout << "null ";
  150.             }
  151.             std::cout << node->data << " ";
  152.             if (node->right != nullptr) {
  153.                 inorderTraversalFull(node->right);
  154.             }
  155.             else {
  156.                 std::cout << "null ";
  157.             }
  158.         }
  159.     }
  160.  
  161.     void postorderTraversalFull(Node* node) {
  162.         if (node != nullptr) {
  163.             if (node->left != nullptr) {
  164.                 postorderTraversalFull(node->left);
  165.             }
  166.             else {
  167.                 std::cout << "null ";
  168.             }
  169.             if (node->right != nullptr) {
  170.                 postorderTraversalFull(node->right);
  171.             }
  172.             else {
  173.                 std::cout << "null ";
  174.             }
  175.             std::cout << node->data << " ";
  176.         }
  177.     }
  178.  
  179.     void inorderTraversalThread(Node* node) {
  180.         if (node != nullptr) {
  181.             inorderTraversalThread(node->left);
  182.             std::cout << node->data << " -> ";
  183.             if (node->next != nullptr) {
  184.                 std::cout << node->next->data;
  185.             }
  186.             else {
  187.                 std::cout << "null";
  188.             }
  189.             std::cout << std::endl;
  190.             inorderTraversalThread(node->right);
  191.         }
  192.     }
  193.  
  194.     void showTrunks(Trunk* p)
  195.     {
  196.         if (p == nullptr) {
  197.             return;
  198.         }
  199.  
  200.         showTrunks(p->prev);
  201.         std::cout << p->str;
  202.     }
  203.  
  204.     void printTree(Node* root, Trunk* prev = nullptr, bool isLeft = false)
  205.     {
  206.         if (root == nullptr) {
  207.             return;
  208.         }
  209.  
  210.         std::string prev_str = "    ";
  211.         auto* trunk = new Trunk(prev, prev_str);
  212.  
  213.         printTree(root->right, trunk, true);
  214.  
  215.         if (!prev) {
  216.             trunk->str = "---";
  217.         }
  218.         else if (isLeft)
  219.         {
  220.             trunk->str = ".---";
  221.             prev_str = "   |";
  222.         }
  223.         else {
  224.             trunk->str = "`---";
  225.             prev->str = prev_str;
  226.         }
  227.  
  228.         showTrunks(trunk);
  229.         std::cout << " " << root->data << std::endl;
  230.  
  231.         if (prev) {
  232.             prev->str = prev_str;
  233.         }
  234.         trunk->str = "   |";
  235.  
  236.         printTree(root->left, trunk, false);
  237.     }
  238.  
  239. public:
  240.     BinarySearchTree() {
  241.         root = nullptr;
  242.     }
  243.  
  244.     void insert(int value) {
  245.         root = insertNode(root, value);
  246.     }
  247.  
  248.     void remove(int value) {
  249.         root = deleteNode(root, value);
  250.     }
  251.  
  252.     void inorder() {
  253.         inorderTraversal(root);
  254.         std::cout << std::endl;
  255.     }
  256.  
  257.     void preorder() {
  258.         preorderTraversal(root);
  259.         std::cout << std::endl;
  260.     }
  261.  
  262.     void postorder() {
  263.         postorderTraversal(root);
  264.         std::cout << std::endl;
  265.     }
  266.  
  267.     void preorderFull() {
  268.         preorderTraversalFull(root);
  269.         std::cout << std::endl;
  270.     }
  271.  
  272.     void inorderFull() {
  273.         inorderTraversalFull(root);
  274.         std::cout << std::endl;
  275.     }
  276.  
  277.     void postorderFull() {
  278.         postorderTraversalFull(root);
  279.         std::cout << std::endl;
  280.     }
  281.  
  282.     void reverseInorderThread(Node* node, Node*& prev) {
  283.         if (node == nullptr) {
  284.             return;
  285.         }
  286.  
  287.         reverseInorderThread(node->left, prev);
  288.  
  289.         node->next = prev;
  290.  
  291.         prev = node;
  292.  
  293.         reverseInorderThread(node->right, prev);
  294.     }
  295.  
  296.     void reverseInorderThread() {
  297.         Node* prev = nullptr;
  298.         reverseInorderThread(root, prev);
  299.     }
  300.  
  301.     void inorderThread() {
  302.         inorderTraversalThread(root);
  303.     }
  304.  
  305.     void print() {
  306.         printTree(root);
  307.     }
  308. };
  309.  
  310. int main() {
  311.     BinarySearchTree tree;
  312.  
  313.     for (int i = 0; i < 100; i++) {
  314.         tree.insert(getRandomNumber(-100, 100));
  315.     }
  316.  
  317.     tree.insert(10);
  318.     tree.insert(3);
  319.     tree.insert(-7);
  320.     tree.insert(0);
  321.     tree.insert(9);
  322.     tree.insert(39);
  323.  
  324.     tree.print();
  325.  
  326.     tree.inorder();
  327.     tree.postorder();
  328.     tree.preorder();
  329.  
  330.     tree.inorderFull();
  331.     tree.postorderFull();
  332.     tree.preorderFull();
  333.  
  334.     tree.reverseInorderThread();
  335.     tree.inorderThread();
  336.  
  337.     tree.print();
  338.  
  339.     system("pause");
  340.  
  341.     return 0;
  342. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement