Advertisement
Guest User

btree remove node

a guest
May 9th, 2015
493
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. template <typename K, typename T>
  8. struct node {
  9.     K key;
  10.     T data;
  11.     node<K, T>* left;
  12.     node<K, T>* right;
  13.     node(): left(nullptr), right(nullptr) {}
  14. };
  15.  
  16. template <typename K, typename T>
  17. node<K, T>* add_node(node<K, T>* root, const K& key, const T& value) {
  18.     if (root == nullptr) {
  19.     node<K, T> *new_node = new node<K, T>();
  20.     new_node->key = key;
  21.     new_node->data = value;
  22.     return new_node;
  23.     }
  24.    
  25.     if (key < root->key) {
  26.     root->left = add_node(root->left, key, value);
  27.     }
  28.     else if (key > root->key) {
  29.     root->right = add_node(root->right, key, value);
  30.     }
  31.     // if keys are equal do nothing
  32.     return root;
  33. }
  34.  
  35. using key_t   = int;
  36. using value_t = std::vector<int>;
  37.  
  38. template <typename K, typename T>
  39. void show(const node<K, T>* root) {}
  40.  
  41. template <>
  42. void show(const node<key_t, value_t>* root) {
  43.     if (root == nullptr) {
  44.     return;
  45.     }
  46.    
  47.     show(root->left);
  48.     show(root->right);
  49.     cout << "key: " << root->key << "; value: ";
  50.     for (auto k: root->data) {
  51.     cout << k << " ";
  52.     }
  53.     cout << endl;
  54. }
  55.  
  56. template <typename K, typename T>
  57. node<K, T>* get_min(node<K, T>* root) {
  58.     node<K, T> *current = root;
  59.    
  60.     while (current->left != nullptr) {
  61.     current = current->left;
  62.     }
  63.    
  64.     return current;
  65. }
  66.  
  67. template <typename K, typename T>
  68. node<K, T>* remove_node(node<K, T>* root, const K& key) {
  69.     if (root == nullptr) {
  70.     return root;
  71.     }
  72.    
  73.     if (key < root->key) {
  74.     root->left = remove_node(root->left, key);
  75.     }
  76.     else if(key > root->key) {
  77.     root->right = remove_node(root->right, key);
  78.     }
  79.     else {
  80.     if (root->left == nullptr) {
  81.         node<K, T>* temp = root->right;
  82.         delete root;
  83.         return temp;
  84.     }
  85.     else if (root->right == nullptr) {
  86.         node<K, T>* temp = root->left;
  87.         delete root;
  88.         return temp;
  89.     }
  90.    
  91.     node<K, T>* temp = get_min(root->right);
  92.     root->key = temp->key;
  93.     root->data = temp->data;
  94.     root->right = remove_node(root->right, temp->key);
  95.     }
  96.     return root;
  97. }
  98.  
  99. template <typename K, typename T>
  100. void find_max(node<K, T>* root, K& key_max) {
  101.     if (root == nullptr) {
  102.     return;
  103.     }
  104.    
  105.     static int acc = 0;
  106.     static int max = 0;
  107.    
  108.     find_max(root->left, key_max);
  109.     find_max(root->right, key_max);
  110.     for_each(root->data.begin(), root->data.end(), [](int k) {
  111.     acc += k;
  112.     });
  113.    
  114.     if (acc > max) {
  115.     max = acc;
  116.     key_max = root->key;
  117.     }
  118.     acc = 0;
  119. }
  120.  
  121. int main() {
  122.     node<key_t, value_t> *tree = nullptr;
  123.     tree = add_node(tree, 5,  {1, 2, 3, 4});
  124.     tree = add_node(tree, 10, {4, 4, 5, 6});
  125.     tree = add_node(tree, 7,  {3, 4});
  126.     tree = add_node(tree, 20, {1, 1, 2, 3});
  127.     tree = add_node(tree, 1,  {0, 3, 1, 2});
  128.     show(tree);
  129.     int key_max = 0;
  130.     find_max(tree, key_max);
  131.     cout << "key: " << key_max << endl;
  132.     remove_node(tree, key_max);
  133.     cout << "Tree after removing key\n";
  134.     show(tree);
  135.    
  136.     return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement