diff options
add seminar09
4 files changed, 88 insertions, 3 deletions
| -rw-r--r-- | README.md | 3 | ||||
| -rw-r--r-- | Seminar08/tree-utils.h | 76 | ||||
| -rw-r--r-- | Seminar09/README.md | 12 | ||||
| -rw-r--r-- | Seminar09/media/rotations.jpg | bin | 0 -> 46788 bytes |
@@ -6,4 +6,5 @@ * Тема 5: Итератори. std::list. Задачи за упражнение [тук най-долу](Seminar05/README.md) * Тема 6: Двойно свързани списъци. Задачи върху списъци. [Упражнение - реализирайте двойно свързан списък](Seminar06/DLLSkeleton.cpp) * Тема 7: Сортиращи алгоритми. -* Тема 8: Дървета. Двоични дървета. Двоични наредени дървета.
\ No newline at end of file +* Тема 8: Дървета. Двоични дървета. Двоични наредени дървета. +* Тема 9: Дървета 2. Балансирани дървета. Ротации. Задачи върху дървета.
\ No newline at end of file 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); +} + // Неща за мое удобство, не е нужно да ги четете: // Взето от: diff --git a/Seminar09/README.md b/Seminar09/README.md index c167b2e..e3404ba 100644 --- a/Seminar09/README.md +++ b/Seminar09/README.md @@ -76,9 +76,19 @@ int main() { С балансирани дървета ще се занимаваме много подробно следващия път. Засега само дефинираме неща, които ще ни бъдат от голяма полза при реализацията на едно такова дърво. ## Ротации и запазване на балансираността +Ротацията е операция върху балансирани двоични дървета, която запазва балансираността им. -Ще бъдат качени на 8ми за да имам време да систематизирам информацията. Извинявам се за забавянето! + +Ротациите обаче променят височината на лявото и дясното поддърво на корена. + +Нека разгледаме 1, където правим ротация около х. Височината на дясното поддърво е 1 + max(h(beta) + h(gamma)). + +След ротацията височината на дясното поддърво е h(gamma). Следователно височината е **намаляла поне с единица**. + +По същата логика височината на лявото поддърво расте отново поне с единица. + +Разбрахме се, че ще се стараем да си държим дърветата ниски. Тези операции ще ни бъдат полезни в тази ни задача. ## Задача първа Да се напише функция, която проверява дали дадено дърво е двоично наредено дърво. diff --git a/Seminar09/media/rotations.jpg b/Seminar09/media/rotations.jpg Binary files differnew file mode 100644 index 0000000..a852ab3 --- /dev/null +++ b/Seminar09/media/rotations.jpg |
