Advertisement
gon2

StringSearchTree.cpp

Mar 7th, 2018
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.65 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. class Node {
  9.     /*
  10.     Táknar hnút í tvíleitartré sem inniheldur strengi
  11.     */
  12.    public:
  13.     string data;
  14.     Node* left;
  15.     Node* right;
  16.  
  17.     Node(string data) {
  18.         /*
  19.         Býr til nýjan barnlausan hnút sem inniheldur strenginn <data>
  20.         */
  21.         this->data = data;
  22.         this->left = nullptr;
  23.         this->right = nullptr;
  24.     }
  25.  
  26.     ~Node() {
  27.         /*
  28.         Passar endurkvæmt upp á að engin börn séu skilin eftir í reiðileysi
  29.         */
  30.         delete this->left;
  31.         delete this->right;
  32.     }
  33. };
  34.  
  35. class StringSearchTree {
  36.     /*
  37.     Táknar tvíleitartré sem inniheldur strengi.
  38.     Samanburðir fara fram á strengjunum sjálfum.
  39.     Einu aðgerðirnar sem eru studdar eru innsetning (put) og uppfletting (contains)
  40.     */
  41.    public:
  42.     StringSearchTree() {
  43.         /*
  44.         Upphafsstillir tómt (hnútalaust) tvíleitartré.
  45.         */
  46.         this->root = nullptr;
  47.     };
  48.  
  49.     ~StringSearchTree() {
  50.         /*
  51.         Eyðingu úthlutað til klasans Node.
  52.          */
  53.         delete this->root;
  54.     }
  55.  
  56.     void put(string data) {
  57.         /*
  58.         Býr til hnút utan um strenginn <data> og setur hann á réttan stað í tvíleitartréð.
  59.         Sé hnútur með sömu gögn þegar í trénu er þeim ekki bætt við aftur.
  60.         Strengurinn <data> þarf að vera skilgreindur, ekki þarf að meðhöndla nullptr.
  61.         */
  62.  
  63.       if (contains(data)) return; // bætum ekki við ef strengurinn er nú þegar í trénu
  64.  
  65.       Node* n = new Node(data); // búum til hnút með strengnum
  66.       Node* temp = this->root;
  67.       int size = 0;
  68.  
  69.       if (temp == nullptr) { // ef tómt tré
  70.           this->root = n;
  71.           return;
  72.       }
  73.  
  74.       if (n->data.compare(this->root->data) < 0) { // ef n á að koma á undan rót
  75.           this->root->left = n;
  76.           n->right = this->root;
  77.           this->root = n;
  78.           return;
  79.       }
  80.  
  81.       while (temp != nullptr) { // stærð trés
  82.           size++;
  83.           temp = temp->right;
  84.       }
  85.  
  86.       temp = this->root; // endurstillum
  87.       Node* tempL = temp->left; // vinstri við temp
  88.  
  89.       for (int i=0; i<size; i++) {
  90.  
  91.          if (n->data.compare(temp->data) < 0) { // n á undan temp
  92.              n->right = temp;
  93.              n->left = temp->left;
  94.              tempL->right = n;
  95.              temp->left = n;
  96.          }
  97.  
  98.          if (n->data.compare(temp->data) > 0) { // n á eftir temp
  99.              if (i == size-1) { // þegar n fer út á enda
  100.                  n->left = temp;
  101.                  temp->right = n;
  102.              }
  103.              tempL = temp;
  104.              temp = temp->right;
  105.          }
  106.  
  107.       }
  108.  
  109.     }
  110.  
  111.     bool contains(string data) {
  112.  
  113.         Node* temp = this->root;
  114.  
  115.         while (temp != nullptr) {
  116.             // skilum true ef data er þegar í trénu:
  117.             if (data.compare(temp->data) == 0) return true;
  118.             temp = temp->right;
  119.         }
  120.  
  121.         // ef ekki skilum við false;
  122.         return false;
  123.     }
  124.  
  125.    private:
  126.     Node* root;
  127.  
  128.     friend ostream& operator<<(std::ostream& os, StringSearchTree& tree);
  129. };
  130.  
  131. ostream& operator<<(ostream& os, StringSearchTree& tree) {
  132.     Node* temp = tree.root;
  133.     while (temp != nullptr) {
  134.         os << temp->data << " ";
  135.         temp = temp->right;
  136.     }
  137.     return os;
  138. };
  139.  
  140. int main() {
  141.     /*
  142.     Tvíleitartréð prófað með því að setja í það ávexti.
  143.     */
  144.  
  145.     StringSearchTree tree;
  146.  
  147.     // Skilgreinum ávextina okkar
  148.     vector<string> fruits = {"Ananas", "Banani", "Epli",    "Greip",          "Mandarína",
  149.                              "Mangó",  "Melóna", "Sítróna", "Stjörnuávöxtur", "Súraldin"};
  150.     // Innsetningin á að virka óháð innsetningarröð
  151.     random_shuffle(fruits.begin(), fruits.end());
  152.     cout << "Setjum ávexti í tréð í eftirfarandi röð:" << endl;
  153.     for (string fruit : fruits) {
  154.         cout << fruit << " ";
  155.         tree.put(fruit);
  156.     }
  157.     cout << endl << endl;
  158.  
  159.     // Athugum hvort tréð innihaldi ávextina
  160.     int missing = 0;
  161.     for (string fruit : fruits) {
  162.         if (!tree.contains(fruit)) {
  163.             missing++;
  164.         }
  165.     }
  166.     if (0 < missing) {
  167.         cout << missing << " ávextir skiluðu sér ekki í tréð.";
  168.     } else {
  169.         cout << "Allir ávextirnir lentu í trénu." << endl;
  170.     }
  171.     if (tree.contains("Ferskja")) {
  172.         cout << "Ferskja fannst í trénu sem ekki var sett þangað. Þetta er villa." << endl << endl;
  173.     } else {
  174.         cout << "Engin ferskja er í trénu, sem er eðlilegt." << endl << endl;
  175.     }
  176.  
  177.     cout << "Skrifum út ávextina í trénu í réttri röð:" << endl;
  178.     cout << tree << endl;
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement