From 5a266b18633ecf9adae5e1c4e701c7e9f242c6be Mon Sep 17 00:00:00 2001 From: Stoycho Kyosev Date: Sat, 10 Dec 2022 22:57:40 +0200 Subject: add seminar09 --- Seminar08/tree-utils.h | 76 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) (limited to 'Seminar08') diff --git a/Seminar08/tree-utils.h b/Seminar08/tree-utils.h index 26c9596..ad3be90 100644 --- a/Seminar08/tree-utils.h +++ b/Seminar08/tree-utils.h @@ -6,7 +6,6 @@ #include // Важни неща: - template struct Tree { T data; @@ -25,6 +24,81 @@ void freeTree(Tree* t) { delete t; } +template +void insertInBST(Tree*& t, const T& elem) { + if (t == nullptr) { + t = new Tree(elem); + return; + } + else if (t->data < elem) { + insertInBST(t->right, elem); + } + else { + insertInBST(t->left, elem); + } +} + +template +Tree* getMinRightNode(const Tree* t) { + assert(t != nullptr); + + Tree* iter = t; + + while (iter->left) { + iter = iter->left; + } + return iter; +} + +template +bool removeElement(Tree*& t, const T& elem) { + if (t == nullptr) + return false; + + if (t->data > elem) { + return removeElement(t->left, elem); + } + else if (t->data < elem) { + return removeElement(t->right, elem); + } + else { // Намерили сме елемента + if (!t->left && !t->right) { // Листо + delete t; + t = nullptr; //!! + } + else if (!t->left && t->right) { // Има само дясно поддърво + Tree* toDelete = t; + t = t->right; + delete toDelete; + } + else if (t->left && !t->right) { // Има само ляво поддърво + Tree* toDelete = t; + t = t->left; + delete toDelete; + } + else { // Вътрешен връх. + T newData = getMinRightNode(t->right)->data; + t->data = newData; + removeElement(t->right, newData); + } + return true; + } +} + +template +bool containsBST(const Tree* t, const T& elem) { + if (t == nullptr) + return false; + + if (t->data == elem) + return true; + + if (t->data < elem) + return containsBST(t->right, elem); + + return containsBST(t->left, elem); +} + // Неща за мое удобство, не е нужно да ги четете: // Взето от: -- cgit v1.3.1-23-gd82d