Website Summary Files Commits Branches @commit @diff @stats
path: root / Seminar08
diff options
context:
space:
mode:
Commit5a266b18633ecf9adae5e1c4e701c7e9f242c6be (patch)
Author
 Stoycho Kyosev <stoycho.kk@gmail.com>
2022-12-10 22:57:40 +0200
Committer
 Stoycho Kyosev <stoycho.kk@gmail.com>
2022-12-10 22:57:40 +0200
Files5b4346a7737f416e1de3f73d9aa5f69e860b2110 /Seminar08
Data-structures-and-algorithms-5a266b18633ecf9adae5e1c4e701c7e9f242c6be.tar
Data-structures-and-algorithms-5a266b18633ecf9adae5e1c4e701c7e9f242c6be.tar.gz
Data-structures-and-algorithms-5a266b18633ecf9adae5e1c4e701c7e9f242c6be.zip
Parentbaf599dca9543462d7450953c705ee86bf7dcccd (diff)
add seminar09
1 files changed, 75 insertions, 1 deletions
-rw-r--r--Seminar08/tree-utils.h76
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<fstream>
// Важни неща:
-
template<class T>
struct Tree {
T data;
@@ -25,6 +24,81 @@ void freeTree(Tree<T>* t) {
delete t;
}
+template<class T>
+void insertInBST(Tree<T>*& t, const T& elem) {
+ if (t == nullptr) {
+ t = new Tree<T>(elem);
+ return;
+ }
+ else if (t->data < elem) {
+ insertInBST(t->right, elem);
+ }
+ else {
+ insertInBST(t->left, elem);
+ }
+}
+
+template<class T>
+Tree<T>* getMinRightNode(const Tree<T>* t) {
+ assert(t != nullptr);
+
+ Tree<T>* iter = t;
+
+ while (iter->left) {
+ iter = iter->left;
+ }
+ return iter;
+}
+
+template<class T>
+bool removeElement(Tree<T>*& 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<T>* toDelete = t;
+ t = t->right;
+ delete toDelete;
+ }
+ else if (t->left && !t->right) { // Има само ляво поддърво
+ Tree<T>* toDelete = t;
+ t = t->left;
+ delete toDelete;
+ }
+ else { // Вътрешен връх.
+ T newData = getMinRightNode(t->right)->data;
+ t->data = newData;
+ removeElement(t->right, newData);
+ }
+ return true;
+ }
+}
+
+template<class T>
+bool containsBST(const Tree<T>* 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);
+}
+
// Неща за мое удобство, не е нужно да ги четете:
// Взето от: