shushus

Спринт 10. Деревья и поиск.

Mar 8th, 2023
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <cassert>
  2.  
  3. template <typename T>
  4. struct TreeNode {
  5.     T value;
  6.     TreeNode* left = nullptr;
  7.     TreeNode* right = nullptr;
  8. };
  9.  
  10. template <typename T>
  11. void DeleteTree(TreeNode<T>* node) {
  12.     if (!node) {
  13.         return;
  14.     }
  15.     DeleteTree(node->left);
  16.     DeleteTree(node->right);
  17.     delete node;
  18. }
  19.  
  20. template <typename T>
  21. bool CheckTreeProperty(const TreeNode<T>* node) {
  22.      return CheckTreeProperty<T>(node, nullptr, nullptr);
  23. }
  24.  
  25. template <typename T>
  26. bool CheckTreeProperty(const TreeNode<T>* node, const T* min, const T* max) {
  27.    
  28.     bool check;
  29.    
  30.     if (min && node->left) {
  31.         if(*min > node->left->value) {
  32.             return false;
  33.         }
  34.     }
  35.  
  36.     if (max && node->right) {
  37.         if (*max < node->right->value) {
  38.             return false;
  39.         }
  40.     }
  41.  
  42.     if (!node->left && !node->right && node) {
  43.         check = true;
  44.         return check;
  45.        
  46.     } else if (!node->left && node->right && node) {
  47.         check = node->value < node->right->value;
  48.        
  49.     } else if (node->left && !node->right && node) {
  50.         check = node->value > node->left->value;
  51.        
  52.     } else {
  53.         check = node->value < node->right->value && node->value > node->left->value;
  54.        
  55.     }
  56.    
  57.     if (node) {
  58.        
  59.         if(node->left) {
  60.             check = CheckTreeProperty<T>(node->left, nullptr, &node->value) && check;
  61.         }
  62.        
  63.         if(node->right) {
  64.             check = CheckTreeProperty<T>(node->right, &node->value, nullptr) && check;
  65.         }
  66.     }
  67.    
  68.     return check;
  69. }
  70.  
  71. int main() {
  72.     using T = TreeNode<int>;
  73.     T* root1 = new T{6,
  74.         new T{4, new T{3}, new T{5}}, new T{7}};
  75.     assert(CheckTreeProperty(root1));
  76.  
  77.     T* root2 = new T{6,
  78.         new T{4, new T{3}, new T{5}}, new T{7, new T{8}}};
  79.     assert(!CheckTreeProperty(root2));
  80.  
  81.     DeleteTree(root1);
  82.     DeleteTree(root2);
  83. }
Advertisement
Add Comment
Please, Sign In to add comment