Advertisement
Foxyzboi

Untitled

Dec 28th, 2022
1,214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.66 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #pragma once
  4.  
  5. template<typename T> class BinaryTree {
  6.     template <typename T> class BinaryTreeItem {
  7.     public:
  8.         BinaryTreeItem<T>() :item() {}
  9.         ~BinaryTreeItem<T>() {}
  10.  
  11.         T getItem() { return item; }
  12.         void setItem(T itm) { item = itm; }
  13.  
  14.         BinaryTreeItem<T>* getLeft() { return left; }
  15.         void setLeft(BinaryTreeItem<T>* lft) { left = lft; }
  16.  
  17.         BinaryTreeItem<T>* getRight() { return right; }
  18.         void setRight(BinaryTreeItem<T>* rgt) { right = rgt; }
  19.  
  20.         BinaryTreeItem<T>* getParent() { return parent; }
  21.         void setParent(BinaryTreeItem<T>* prnt) { parent = prnt; }
  22.  
  23.     private:
  24.         T item;
  25.         BinaryTreeItem<T>* left = nullptr;
  26.         BinaryTreeItem<T>* right = nullptr;
  27.         BinaryTreeItem<T>* parent = nullptr;
  28.     };
  29.  
  30. public:
  31.     BinaryTree<T>() {}
  32.     ~BinaryTree<T>() {}
  33.    
  34.     int SizeTree = 0;
  35.    
  36.     void getSize()
  37.     {
  38.         return SizeTree;
  39.     }
  40.  
  41.     bool addItem(T itm, T loc) {
  42.         if (root == nullptr) {
  43.             root = new BinaryTreeItem<T>();
  44.             root->setItem(itm);
  45.             return true;
  46.             SizeTree++;
  47.         }
  48.  
  49.         if (findItem(itm) != nullptr) return false;
  50.  
  51.         BinaryTreeItem<T>* insertLoc = findItem(loc);
  52.         if (insertLoc == nullptr) return false;
  53.  
  54.         if (insertLoc->getLeft() == nullptr) {
  55.             BinaryTreeItem<T>* newItem = new BinaryTreeItem<T>();
  56.             newItem->setItem(itm);
  57.             newItem->setParent(insertLoc);
  58.             insertLoc->setLeft(newItem);
  59.             SizeTree++;
  60.             return true;
  61.         }
  62.  
  63.         if (insertLoc->getRight() == nullptr) {
  64.             BinaryTreeItem<T>* newItem = new BinaryTreeItem<T>();
  65.             newItem->setItem(itm);
  66.             newItem->setParent(insertLoc);
  67.             insertLoc->setRight(newItem);
  68.             SizeTree++;
  69.             return true;
  70.         }
  71.  
  72.         return false;
  73.     }
  74.  
  75.     bool remove(T itm) {
  76.         BinaryTreeItem<T>* removeItem = findItemRecursionStart(itm);
  77.         if (removeItem == nullptr || removeItem->getLeft() != nullptr || removeItem->getRight() != nullptr) return false;
  78.  
  79.         if (removeItem == root) root = nullptr;
  80.  
  81.         if (removeItem->getParent()->getLeft() == removeItem) {
  82.             removeItem->getParent()->setLeft(nullptr);
  83.         } else {
  84.             removeItem->getParent()->setRight(nullptr);
  85.         }
  86.  
  87.         delete removeItem;
  88.         SizeTree--;
  89.     }
  90.  
  91.     void show() {
  92.         if (root == nullptr) return;
  93.         showTree(root, "");
  94.     }
  95.  
  96. private:
  97.     BinaryTreeItem<T>* root = nullptr;
  98.  
  99.     BinaryTreeItem<T>* findItem(T itm) {
  100.         if (root == nullptr) return nullptr;
  101.  
  102.         BinaryTreeItem<T>* cur = root;
  103.         int state = 0;
  104.  
  105.         while (true) {
  106.             if (cur->getItem() == itm) return cur;
  107.             if (state < 1 && cur->getLeft() != nullptr) { cur = cur->getLeft(); state = 0; }
  108.             else if (state < 2 && cur->getRight() != nullptr) {
  109.                 cur = cur->getRight();  state = 0;
  110.             } else {
  111.                 if (cur->getParent() == nullptr) return nullptr;
  112.                 state = cur == cur->getParent()->getLeft() ? 1 : 2;
  113.                 cur = cur->getParent();
  114.             }
  115.         }
  116.     }
  117.  
  118.     BinaryTreeItem<T>* findItemRecursion(BinaryTreeItem<T>* currItem, T itm) {
  119.         if (currItem == nullptr) return nullptr;
  120.  
  121.         if (currItem->getItem() == itm) return currItem;
  122.  
  123.         BinaryTreeItem<T>* cur = findItemRecursion(currItem->getLeft(), itm);
  124.         return (cur == nullptr) ? findItemRecursion(currItem->getRight(), itm) : cur;
  125.     }
  126.  
  127.     BinaryTreeItem<T>* findItemRecursionStart(T itm) {
  128.         return root == nullptr ? nullptr : findItemRecursion(root, itm);
  129.     }
  130.  
  131.     void showTree(BinaryTreeItem<T>* currItem, std::string indent) {
  132.         if (currItem == nullptr) return;
  133.  
  134.         std::cout << indent << currItem->getItem() << std::endl;
  135.  
  136.         showTree(currItem->getLeft(), indent + "  ");
  137.         showTree(currItem->getRight(), indent + "  ");
  138.     }
  139.     void changeItem(BinaryTreeItem<T>* currItem, T itm, T itmFind)
  140.     {
  141.         for (int i = 0; i < getSize(); i++)
  142.         {
  143.             if (itmFind == *findItem(T itmFind))
  144.             {
  145.                 currItem->item = itm;
  146.             }
  147.         }
  148.     }
  149. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement