Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.04 KB | None | 0 0
  1. #pragma once
  2. #include <algorithm>
  3.  
  4. ///////////////////////
  5. //// BINARY TREES ////
  6. //////////////////////
  7.  
  8. template<typename T>
  9. struct TreeNode {
  10.     T n;
  11.     TreeNode<T>* left;
  12.     TreeNode<T>* right;
  13.  
  14.     ~TreeNode() {
  15.         std::cout << left << " " << right << std::endl;
  16.         delete left;
  17.         delete right;
  18.     }
  19. };
  20.  
  21. template<typename T, typename = decltype(std::declval<T>() < std::declval<T>()), typename = decltype(std::declval<T>() == std::declval<T>())>
  22. class BinTree {
  23.     public:
  24.         TreeNode<T>* root;
  25.         BinTree() = default;
  26.  
  27.         ~BinTree() { delete root; }
  28.  
  29.         // finding
  30.         T* find(T n) {
  31.             TreeNode<T>* result = find(n, root);
  32.             return result == nullptr ? nullptr : &(result->n);
  33.         }
  34.  
  35.         // deleting
  36.         void operator-= (T n) {
  37.             TreeNode<T>* node_ptr = find(n, root);
  38.             if (node_ptr) {del(node_ptr);}
  39.         }
  40.  
  41.         //inserting
  42.         bool operator+= (T n) {
  43.             return insert(n, root);
  44.         }
  45.  
  46.         bool contains(T n) {
  47.             return find(n) != nullptr;
  48.         }
  49.  
  50.         int size(TreeNode<T>* current) {
  51.             return (!current) ? 0 : 1 + size(current->left) + size(current->right);
  52.         }
  53.  
  54.         int size() {
  55.             return size(root);
  56.         }
  57.  
  58.         int get_degree(T n) {
  59.             return get_degree(n, root, 0);
  60.         }
  61.  
  62.     private:
  63.         TreeNode<T>* find(T n, TreeNode<T>* start) {
  64.             if (start == nullptr || n == start->n) {
  65.                 return start;
  66.             }
  67.             if (n < start->n) {
  68.                 return find(n, start->left);
  69.             } else {
  70.                 return find(n, start->right);
  71.             }
  72.         }
  73.  
  74.         // returns the minimum node of a subtree
  75.         TreeNode<T>* find_min(TreeNode<T>* current) {
  76.             while (current->left != nullptr) { current = current->left;}
  77.             return current;
  78.         }
  79.  
  80.         // returns the parent of the child arg
  81.         TreeNode<T>* find_parent(TreeNode<T>* child, TreeNode<T>* current) {
  82.             if (current == nullptr) {
  83.                 return nullptr;
  84.             }
  85.             if (current->left == child || current->right == child) {
  86.                 return current;
  87.             } else {
  88.                 TreeNode<T>* result_left = find_parent(child, current->left);
  89.                 if (result_left != nullptr) {
  90.                     return result_left;
  91.                 } else {
  92.                     return find_parent(child, current->right);
  93.                 }
  94.             }
  95.         }
  96.  
  97.         // delete a node (or to get technical a value) from the tree
  98.         void del(TreeNode<T>*& to_delete) {
  99.             if (to_delete->right != nullptr) {
  100.                 // RIGHT = NODE
  101.                 TreeNode<T>* min = find_min(to_delete->right);
  102.                 TreeNode<T>* min_parent = find_parent(min, to_delete);
  103.  
  104.                 // reassign the pointers around min
  105.                 if (min->right != nullptr) {
  106.                     min_parent->left = min->right;
  107.                 }
  108.                
  109.                 // copy the value at min to to_delete
  110.                 to_delete->n = std::move(min->n);
  111.                
  112.                 // delete the min node
  113.                 if (min_parent->left == min) {
  114.                     min_parent->left = nullptr;
  115.                 } else {
  116.                     min_parent->right = nullptr;
  117.                 }
  118.                 min->left = nullptr;
  119.                 min->right = nullptr;
  120.                 delete min;
  121.                
  122.             } else if (to_delete->left != nullptr) {
  123.                 // LEFT = NODE, RIGHT = NULLPTR
  124.                 // let left child take over the to_delete node
  125.                 TreeNode<T>* left_child = to_delete->left;
  126.                 to_delete->n = std::move(left_child->n);
  127.                 to_delete->left = left_child->left;
  128.                 to_delete->right = left_child->right;
  129.  
  130.                 // delete the left_child node
  131.                 left_child->left = nullptr;
  132.                 left_child->right = nullptr;
  133.                 delete left_child;
  134.             } else {
  135.                 // LEFT = NULLPTR, RIGHT = NULLPTR
  136.                 // no children, so just delete
  137.                 if (to_delete == root) {
  138.                     root = nullptr;
  139.                     delete to_delete;
  140.                     return;
  141.                 }
  142.                 TreeNode<T>* parent = find_parent(to_delete, root);
  143.                 if (parent->left == to_delete) {
  144.                     parent->left = nullptr;
  145.                 } else {
  146.                     parent->right = nullptr;
  147.                 }
  148.                 delete to_delete;
  149.             }
  150.         }
  151.  
  152.         bool insert(const T to_insert, TreeNode<T>*& current) {
  153.             if (current == nullptr) {
  154.                 current = new TreeNode<T> {to_insert, nullptr, nullptr };
  155.                 return true;
  156.             }            
  157.  
  158.             if (current->n == to_insert) {
  159.                 return false;
  160.             }
  161.  
  162.             if (current->n > to_insert) {
  163.                 return insert(to_insert, current->left);
  164.             }
  165.  
  166.             return insert(to_insert, current->right);
  167.            
  168.         }
  169.  
  170.         int get_degree(const T& n, TreeNode<T>* current, int current_degree) {
  171.             if (current->n == n) {
  172.                 return current_degree;
  173.             }
  174.            
  175.             int result_left = -1;
  176.             int result_right = -1;
  177.             if (current->left != nullptr) {
  178.                 result_left = get_degree(n, current->left, current_degree + 1);
  179.             }
  180.             if (current->right != nullptr) {
  181.                 result_right = get_degree(n, current->right, current_degree + 1);
  182.             }
  183.             return std::max(result_left, result_right);
  184.         }
  185. };
  186.  
  187. ///////////////////////
  188. /////// GRAPHS ///////
  189. //////////////////////
  190.  
  191. template<typename T>
  192. struct Node {
  193.     int id;
  194.     T data;
  195. };
  196.  
  197. template<typename T>
  198. struct Edge {
  199.     Node<T>* node_a;
  200.     Node<T>* node_b;
  201.     int weight;
  202. };
  203.  
  204. template<typename T>
  205. class Graph {
  206.     public:
  207.         // Public fields
  208.         Node<T>* nodes;
  209.         Edge<T>* edges;
  210.         const int max_nodes;
  211.         const int max_edges;
  212.  
  213.         // Constructor
  214.         Graph<T>(int max_nodes_arg, int max_edges_arg):
  215.             nodes {new Node<T>[max_nodes_arg]},
  216.             edges {new Edge<T>[max_edges_arg]},
  217.             max_nodes{max_nodes_arg},
  218.             max_edges{max_edges_arg}{};
  219.        
  220.         // Destructor
  221.         ~Graph() {
  222.             delete[] edges;
  223.             delete[] nodes;
  224.             std::cout << "graph destroyed.\n";
  225.         }
  226.        
  227.         // Adding a Node (with +=)
  228.         void operator+=(Node<T> node) {
  229.             if (current_amount_nodes < max_nodes) {
  230.                 insert(node);
  231.                 current_amount_nodes++;
  232.             } else {
  233.                 throw std::out_of_range("maximum amount of nodes reached");
  234.             }
  235.         }
  236.         int get_amount_nodes() {return current_amount_nodes;}
  237.         int get_amount_edges() {return current_amount_edges;}
  238.         void inc_amount_edges() {current_amount_edges++;}
  239.     private:
  240.         int current_amount_nodes = 0;
  241.         int current_amount_edges = 0;
  242.  
  243.         /**
  244.          *@
  245.         */
  246.         void insert(Node<T> const& toInsert) {
  247.             int i = 0;    
  248.             while (i < (max_nodes - 1) && nodes[i].id > toInsert.id) {
  249.                 i++;
  250.             }
  251.  
  252.             for(int j = i; j < get_amount_nodes(); j++) {
  253.                 nodes[j + 1] = nodes[j];
  254.             }
  255.             nodes[i] = toInsert;
  256.         }
  257. };
  258.  
  259. template<typename T>
  260. void add_edge(Graph<T>& graph, Node<T>* node_a, Node<T>* node_b, int weight) {
  261.     auto i = graph.get_amount_edges(); // next position to write to
  262.     if (i < graph.max_edges) {
  263.         graph.edges[i] = Edge<T>{ node_a, node_b, weight };
  264.         graph.inc_amount_edges();
  265.     } else {
  266.         throw std::out_of_range("maximum amount of edges reached");
  267.     }
  268. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement