Website Summary Files Commits Branches @commit @diff @stats
path: root / Seminar09 / solutions.cpp
diff options
context:
space:
mode:
Commit7eee5a78005a9a569186d2c8b4b645a818ab9bf1 (patch)
Author
 Stoycho Kyosev <skyosev@192.168.100.17>
2024-10-06 07:04:44 -0400
Committer
 Stoycho Kyosev <skyosev@192.168.100.17>
2024-10-06 07:04:44 -0400
Files84594e0af29cefa5aae76ace5f8eb81484400e31 /Seminar09/solutions.cpp
Data-structures-and-algorithms-7eee5a78005a9a569186d2c8b4b645a818ab9bf1.tar
Data-structures-and-algorithms-7eee5a78005a9a569186d2c8b4b645a818ab9bf1.tar.gz
Data-structures-and-algorithms-7eee5a78005a9a569186d2c8b4b645a818ab9bf1.zip
Parent0841635826cb03c0e74cd75ec3c97c4c3b594d8b (diff)
Cleanup
1 files changed, 0 insertions, 140 deletions
-rw-r--r--Seminar09/solutions.cpp140
diff --git a/Seminar09/solutions.cpp b/Seminar09/solutions.cpp
deleted file mode 100644
index 94958e5..0000000
--- a/Seminar09/solutions.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-#include"../Seminar08/tree-utils.h"
-#include<optional>
-#include<vector>
-#include<assert.h>
-#include<algorithm>
-
-template<class T>
-std::optional<T> getMax(const Tree<T>* t) {
- if (t == nullptr)
- return {}; // Няма стойност
-
- T res = t->data;
-
- std::optional<T> left = getMax(t->left);
- std::optional<T> right = getMax(t->right);
-
- if (left.has_value())
- res = std::max(res, left.value());
-
- if (right.has_value())
- res = std::max(res, right.value());
-
- return res;
-}
-
-bool isBSTRec(const Tree<int>* t, int min, int max) {
- if (t == nullptr)
- return true;
-
- if (t->data < min || t->data > max)
- return false;
-
- return isBSTRec(t->left, min, t->data) && isBSTRec(t->right, t->data, max);
-}
-
-bool isBST(const Tree<int>* t) {
- return isBSTRec(t, INT_MIN, INT_MAX);
-}
-
-template<class T>
-Tree<T>* buildFromRec(const std::vector<T>& v, int start, int end) {
- if (end < start)
- return nullptr;
-
- int mid = (end - start) / 2 + start;
-
- return new Tree<T>(v[mid], buildFromRec(v, start, mid - 1), buildFromRec(v, mid + 1, end));
-}
-
-template<class T>
-Tree<T>* buildFrom(const std::vector<T>& v) {
- return buildFromRec(v, 0, v.size() - 1);
-}
-
-template<class T>
-bool isSameTree(const Tree<T>* fst, const Tree<T>* snd) {
- if (!fst && !snd)
- return true;
-
- if ((fst && !snd) || (!fst && snd) || fst->data != snd->data)
- return false;
-
- return isSameTree(fst->left, snd->left) && isSameTree(fst->right, snd->right);
-}
-
-template<class T>
-Tree<T>* clone(const Tree<T>* t) {
- if (!t)
- return nullptr;
-
- return new Tree<T>(t->data, clone(t->left), clone(t->right));
-}
-
-template<class T>
-void rotateLeft(Tree<T>*& root) {
- assert(root->right != nullptr);
-
- Tree<T>* originalRight = root->right;
- root->right = originalRight->left;
- originalRight->left = root;
- root = originalRight;
-}
-
-template<class T>
-void rotateRight(Tree<T>*& root) {
- assert(root->left != nullptr);
-
- Tree<T>* originalLeft = root->left;
- root->left = originalLeft->right;
- originalLeft->right = root;
- root = originalLeft;
-}
-
-void rotationsTests() {
- std::vector<int> v;
- for (size_t i = 0; i < 100; i++)
- v.push_back(rand() % 100);
-
- std::sort(v.begin(), v.end());
-
- Tree<int>* example = buildFrom(v);
- Tree<int>* exampleClone = clone(example);
-
- // Тестваме лява ротация:
- // Тука не правя проверки за nullptr понеже не е това целта на този пример
- Tree<int>* alpha = clone(example->left);
- Tree<int>* beta = clone(example->right->left);
- Tree<int>* gamma = clone(example->right->right);
-
- rotateLeft(example);
-
- assert(isSameTree(alpha, example->left->left));
- assert(isSameTree(beta, example->left->right));
- assert(isSameTree(gamma, example->right));
-
- freeTree(alpha); freeTree(beta); freeTree(gamma);
-
- // Тествам дясна ротация
- alpha = clone(example->left->left);
- beta = clone(example->left->right);
- gamma = clone(example->right);
-
- rotateRight(example);
-
- assert(isSameTree(alpha, example->left));
- assert(isSameTree(beta, example->right->left));
- assert(isSameTree(gamma, example->right->right));
-
- freeTree(alpha); freeTree(beta); freeTree(gamma);
-
- // Лявата ротация е симетрична на дясната следователно като направим лява + дясна трябва да остане същото дърво
- assert(isSameTree(example, exampleClone));
-
- freeTree(example);
- freeTree(exampleClone);
-}
-
-int main() {
- rotationsTests();
-} \ No newline at end of file