Advertisement
amsavchenko

Untitled

May 16th, 2018
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3. #include <string>
  4. #include <vector>
  5. using namespace std;
  6.  
  7.  
  8.  
  9. template <typename T>
  10. struct treenode {
  11.     T data;
  12.     int kids;
  13.     treenode *leftkid;
  14.     treenode *rightkid;
  15.  
  16.    
  17. };
  18.  
  19. template <typename T>
  20. class tree {
  21.     treenode<T> *root;
  22.    
  23.     void destroytree(treenode<T> *node) {
  24.         if (node != nullptr) {
  25.             destroytree(node->leftkid);
  26.             destroytree(node->rightkid);
  27.             delete node;
  28.         }
  29.     }
  30.    
  31.     void postorder_print(treenode<T> *node) {
  32.         if (node != nullptr) {
  33.             cout << node->data << endl;
  34.             postorder_print(node->leftkid);
  35.             postorder_print(node->rightkid);
  36.         }
  37.     }
  38.    
  39.     int get_value_of_function (treenode<void*> *node) {
  40.         return ((int(*)(int))(node->data))(5);
  41.     }
  42.    
  43.     void print_value_of_function (treenode<void*> *node) {
  44.         if (node != nullptr) {
  45.             cout << get_value_of_function(node) << endl;;
  46.             print_value_of_function(node->leftkid);
  47.             print_value_of_function(node->rightkid);
  48.         }
  49.     }
  50.    
  51.    
  52.     // 1. map
  53.     void map (treenode<T> *node, T value) {
  54.         if (node != nullptr) {
  55.             node->data = value;
  56.             map (node->leftkid, value);
  57.             map (node->rightkid, value);
  58.         }
  59.     }
  60.    
  61.     bool check (treenode<string> *node) {
  62.         if ((node->data).length() < 5) return true;
  63.         else return false;
  64.     }
  65.    
  66.     bool check (treenode<void*> *node) {
  67.         if (get_value_of_function(node) < 10) return true;
  68.         else return false;
  69.     }
  70.    
  71.     // 2. where
  72.     void where (treenode<T> *node, tree<T> *new_tree) { // УКАЗАТЕЛЬ  на новое дерево
  73.         if (node != nullptr) {
  74.             if (check(node)) {
  75.                 T key = node->data;
  76.                 new_tree->insert(key);
  77.             }
  78.             where (node->leftkid, new_tree);
  79.             where (node->rightkid, new_tree);
  80.         }
  81.     }
  82.    
  83.    
  84.     // 3. слияние
  85.     void merge_trees (treenode<T> *node_of_1st_tree, tree<T> second_tree) {
  86.         // к дереву second_tree прибавляем все элементы дерева для к-ого вызвана ф-ия
  87.         if (node_of_1st_tree != nullptr) {
  88.             second_tree->insert(node_of_1st_tree->data);
  89.             merge_trees(node_of_1st_tree->leftkid, second_tree);
  90.             merge_trees(node_of_1st_tree->rightkid, second_tree);
  91.         }
  92.     }
  93.    
  94.     // 4. извлечение поддерева по заданному элементу
  95.     void subtree_extraction (treenode<T> *node, T value, tree<T> *res_tree, vector<treenode<T>*> *store) {
  96.         if (node != nullptr) {
  97.             if(node->data == value) {
  98.                 store->push_back(node);
  99.                 return;
  100.             }
  101.             else {
  102.                 subtree_extraction(node->leftkid, value, res_tree, store);
  103.                 subtree_extraction(node->rightkid, value, res_tree, store);
  104.                
  105.             }
  106.         // берем первое совпадение элемента в соответствии с обходом
  107.         if (!store->empty()) res_tree->root = store->at(0);
  108.         }
  109.     }
  110.    
  111.    
  112.     // 5. поиск элемента на вхождение
  113.     bool does_value_contain (treenode<T> *node, T value, bool* check) {
  114.         if (node != nullptr) {
  115.             if (node->data == value) {
  116.                 *check = true;
  117.             }
  118.             else {
  119.                 does_value_contain(node->leftkid, value, check);
  120.                 does_value_contain(node->rightkid, value, check);
  121.             }
  122.         }
  123.         if (*check == true) return true;
  124.         else return false;
  125.     }
  126.    
  127.     bool does_subtree_contain (treenode<T> *node, tree<T> *new_tree, vector<bool> *store) {
  128.        
  129.     }
  130.    
  131.    
  132.  
  133. ////////////////////////////////////////////////////////////
  134.    
  135. public:
  136.     tree() {
  137.         root = nullptr;
  138.     }
  139.    
  140.     ~tree() {
  141.         destroytree(root);
  142.     }
  143.  
  144.     void insert(T data);
  145.    
  146.     void postorder_print() {
  147.         postorder_print(root);
  148.     }
  149.     void map (T value) {
  150.         map (root, value);
  151.     }
  152.     void print_value_of_function () {
  153.         print_value_of_function (root);
  154.     }
  155.     void where (tree<T> *new_tree) {
  156.         where (root, new_tree);
  157.     }
  158.     void merge_trees (tree<T> *second_tree) { //
  159.         merge_trees(root, second_tree);
  160.     }
  161.     void subtree_extraction (T value, tree<T> *res_tree) {
  162.         vector<treenode<T>*> *store = new vector<treenode<T>*>;
  163.         subtree_extraction(root, value, res_tree, store);
  164.         delete store;
  165.     }
  166.     bool does_value_contain (T value) {
  167.         bool* check = new bool;
  168.         return does_value_contain(root, value, check);
  169.     }
  170.  
  171. };
  172.  
  173.  
  174.  
  175. template <typename T>
  176. void tree<T>:: insert(T data) {
  177.     if (root == nullptr) {
  178.         root = new treenode<T>;
  179.         root->leftkid = nullptr;
  180.         root->rightkid = nullptr;
  181.         root->data = data;
  182.         root->kids = 0;
  183.     }
  184.     else {
  185.         treenode<T> *curr = root;
  186.         int n(0), side(0), levelsize(0), range(0), number=root->kids+2;
  187.        
  188.         while (pow(2, n) <= number) {
  189.             levelsize = pow(2, n);
  190.             n++;
  191.         }
  192.         range = levelsize;
  193.        
  194.         while (range != 1) {
  195.             if (number < (levelsize + range / 2)) {
  196.                 curr->kids++;
  197.                 if (range != 2) {
  198.                     curr = curr->leftkid;
  199.                     range = range / 2;
  200.                 }
  201.                 else {
  202.                     side = 0;
  203.                     break;
  204.                 }
  205.             }
  206.             else {
  207.                 curr->kids++;
  208.                 if (range != 2) {
  209.                     curr = curr->rightkid;
  210.                     range = range / 2;
  211.                     levelsize += range;
  212.                 }
  213.                 else {
  214.                     side = 1;
  215.                     break;
  216.                 }
  217.             }
  218.         }
  219.        
  220.         treenode<T> *newnode = new treenode<T>;
  221.         newnode->kids = 0;
  222.         newnode->leftkid = nullptr;
  223.         newnode->rightkid = nullptr;
  224.         newnode->data = data;
  225.        
  226.         if (side == 0) {
  227.             curr->leftkid = newnode;
  228.         }
  229.         else {
  230.             curr->rightkid = newnode;
  231.         }
  232.        
  233.        
  234.     }
  235. }
  236.  
  237. int f1 (int x) {
  238.     return x + x;
  239. }
  240.  
  241. int f2 (int x) {
  242.     return pow(x, 3);
  243. }
  244.  
  245. int f3 (int x) {
  246.     return x + 1;
  247. }
  248.  
  249. int main() {
  250.    
  251.     void *ptr[] = {(void*)f1, (void*)f2, (void*)f3};
  252.  
  253.    
  254.    
  255.     tree<string> char_tree;
  256.     string s1 = "winter";
  257.     string s2 = "spring";
  258.     string s3 = "s";
  259.     string s4 = "au";
  260.    
  261.     char_tree.insert(s1);
  262.     char_tree.insert(s2);
  263.     char_tree.insert(s3);
  264.     char_tree.insert(s4);
  265.     char_tree.insert(s1);
  266.     char_tree.insert(s2);
  267.     char_tree.insert(s3);
  268.     char_tree.insert(s4);
  269.     char_tree.insert(s2);
  270.     char_tree.insert(s2);
  271.     char_tree.insert(s2);
  272.     char_tree.insert(s2);
  273.  
  274.  
  275.     /*char_tree.insert(s1);
  276.     char_tree.insert(s3);
  277.     char_tree.insert(s4);
  278.     char_tree.insert(s1);
  279.     char_tree.insert(s3);
  280.     char_tree.insert(s4); */
  281.     string add = "mephi";
  282.  
  283.     if (char_tree.does_value_contain(s3)) cout << "s3 yes" << endl;
  284.     else cout << "no" << endl;
  285.     if (char_tree.does_value_contain(s1)) cout << "s1 yes" << endl;
  286.     else cout << "no" << endl;
  287.     if (char_tree.does_value_contain(s2)) cout << "s2 yes" << endl;
  288.     else cout << "no" << endl;
  289.     if (char_tree.does_value_contain(s4)) cout << "s4 yes" << endl;
  290.     else cout << "no" << endl;
  291.     if (char_tree.does_value_contain(add)) cout << "yes" << endl;
  292.     else cout << "mephi no" << endl;
  293.  
  294.     /*tree<string> *new_tree = new tree<string>;
  295.  
  296.     //vector<treenode<string> *> store;
  297.     char_tree.subtree_extraction(s2, new_tree);
  298.     new_tree->postorder_print();*/
  299.    
  300.    
  301.     /*string add = "mephi";
  302.     string add2 = "mephi2";
  303.     string add3 = "mephi3";
  304.     string add4 = "mephi4";
  305.    
  306.     tree<string> *new_tree = new tree<string>;
  307.     new_tree->insert(add);
  308.     new_tree->insert(add2);
  309.     new_tree->insert(add3);
  310.     new_tree->insert(add4);
  311.    
  312.     char_tree.merge_trees(new_tree);
  313.     new_tree->postorder_print();
  314.    
  315.     //char_tree.map(add);
  316.     //char_tree.postorder_print();
  317.    
  318.     tree<string> *new_tree = new tree<string>;
  319.     char_tree.where(new_tree);
  320.     new_tree->postorder_print();
  321.    
  322.    
  323.     tree<void*> function_tree;
  324.     function_tree.insert(ptr[0]);
  325.     function_tree.insert(ptr[1]);
  326.     function_tree.insert(ptr[2]);
  327.    
  328.     //function_tree.postorder_print();
  329.     //function_tree.print_value_of_function();
  330.    
  331.     //function_tree.map(ptr[1]);
  332.    
  333.     //function_tree.postorder_print();
  334.     //function_tree.print_value_of_function();
  335.    
  336.     tree<void*> *new_tree2 = new tree<void*>;
  337.    
  338.     function_tree.subtree_extraction(ptr[0], new_tree2);
  339.     //function_tree.where(new_tree2);
  340.     new_tree2->postorder_print();
  341.     new_tree2->print_value_of_function(); */
  342.    
  343.    
  344.    
  345.    
  346.    
  347.    
  348.    
  349.    
  350.    
  351.    
  352.    
  353.    
  354.    
  355. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement