Дървета Калин Георгиев 20 октомври 2016 г. Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 1 / 35
Интуиция Интуиция. Йерархична структура от данни Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 2 / 35
Интуиция Фамилно дърво баща ниво (етаж) 0 син 1 син 2 ниво 1 внук 1 внук 2 внук 3 ниво 2 правнук 1 ниво 3 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 3 / 35
Интуиция Фамилно дърво родител, наследник корен листо път ниво баща ниво (етаж) 0 син 1 син 2 ниво 1 внук 1 внук 2 внук 3 ниво 2 правнук 1 ниво 3 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 4 / 35
Интуиция Decision Tree мъж Мъж или жена под 18 години? под 18 години? Barbie Харесва ли Поп музика Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 5 / 35 Спортува ли? да Плакат на Metallica Лакове и червила харесва ли Star Wars? харесва ли Star Wars? Въже за скачане да не не да Лазерен меч Количка с дистанционно Щанга Робот BB-8
Интуиция Формална дефиниция и абстракция Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 6 / 35
Дефиниция Дефиниции Свързан неориентиран граф без цикли Индуктивна дефиниция Фиксираме елемент () / D и го наричаме празно дърво Празното дърво е дърво Ако L T и R T са дървета, а x е елемент (x D), то тройката (структурата) T = (x, L T, R T ) наричаме двоично дърво T с корен x, ляво поддърво L T и дясно поддърво R T. x Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 7 / 35
Дефиниция Дърво с числа 7 30 5 12 50 90 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 8 / 35
Дефиниция Двоично наредено дърво 50 < 30 90 < < 20 45 < 70 99 X 50 70 20 45 99 70 30 20 30 45 50 70 90 99 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 9 / 35
Представяне и операции Представяне Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 10 / 35
Представяне и операции Тройна кутия 7 30 5 12 50 90 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 11 / 35
Представяне и операции Операции Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 12 / 35
Представяне и операции Добавяне на елемент 7 30 5 12 50 90 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 13 / 35
Представяне и операции Следа. Добавяне и намиране на елемент L 7 30 5 R L 12 50 90 LRL LRR Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 14 / 35
Представяне и операции Рекурсивни операции Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 15 / 35
Представяне и операции Търсене на елемент 7 30 5 12 50 90 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 16 / 35
Представяне и операции Проверка за принадлежност Среща ли се елементът y сред елементите на дървото T? Празното дърво е дърво Ако L T и R T са дървета, а x е елемент (x D), то тройката (структурата) T = (x, L T, R T ) наричаме двоично дърво T с корен x, ляво поддърво L T и дясно поддърво R T. L T x R T bool member (int y, T): Ако дървото е празно, то y не е елемент на дървото. return false Ако T = (x, L T, R T ) е непразно, то y е елемент на T, ако y == x или y е елемент на L T или y е елемент на R T. return y==root(t) member (y, LT) member (y,rt) Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 17 / 35
Представяне и операции Сума не елементите Каква е сумата на елементите на дървото? Празното дърво е дърво Ако L T и R T са дървета, а x е елемент (x D), то тройката (структурата) T = (x, L T, R T ) наричаме двоично дърво T с корен x, ляво поддърво L T и дясно поддърво R T. x S L T S R T x int sum (T): Ако дървото е празно, то сумата на елементите е 0. return 0 Ако T = (x, L T, R T ) е непразно, то сумата на елементите е сбора на сумата на елементите на L T, на сумата на елементите на R T и на числото x. return root(t) + sum (LT) + sum (RT) Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 18 / 35
Представяне и операции Други прости рекурсивни операции Най-голям елемент в дървото Брой на елементитите в дървото Височина на дървото Брой на листата в дървото Празното дърво е дърво Ако L T и R T са дървета, а x е елемент (x D), то тройката (структурата) T = (x, L T, R T ) наричаме двоично дърво T с корен x, ляво поддърво L T и дясно поддърво R T. x?? F L T F R T x Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 19 / 35
Представяне и операции x Сериализация Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 20 / 35
Двоични наредени дървета Операции с двоични наредени дървета Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 21 / 35
Двоични наредени дървета Вмъкване 50 30 90 20 45 70 99 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 22 / 35
Двоични наредени дървета Намиране на най-голям и най-малък елемент x y Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 23 / 35
Двоични наредени дървета Изтриване x < < y z Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 24 / 35
Двоични наредени дървета Изтриване x < < y z Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 25 / 35
Двоични наредени дървета Изтриване z < < y Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 26 / 35
Обхождания Обхождане с рекурсия VS. обхождане чрез стек Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 27 / 35
Обхождания Отпечатване Отпечатване с рекурсия void print (t){ if ( empty (t)) return ; print ( left (t )); cout << root (t); print ( right (t )); } Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 28 / 35
Обхождания Прецес на отпечатване print (T 50 ) print (left(t 50 ));cout << root (T 50 ); print (right(t 50 )) print (left(t 30 ));cout << root (T 30 ); print (right(t 30 )) 30 print (left(t 20 ));cout << root (T 20 ); print (right(t 20 )) 50 20 30 90 20 45 70 99 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 29 / 35
Обхождания Прецес на отпечатване print (T 50 ) p(t 50 ) print (left(t 50 ));cout << root (T 50 ); print (right(t 50 )) p(t 30 ) p(t 50 ):<<50;p(T 90 ) print (left(t 30 ));cout << root (T 30 ); print (right(t 30 )) p(t 20 ) p(t 30 ):<<30;p(T 45 ) p(t 50 ):<<50;p(T 90 ) 30 print (left(t 20 ));cout << root (T 20 ); print (right(t 20 )) 20 50 30 90 20 45 70 99 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 30 / 35
Обхождания Отпечатване чрез стек Отпечатване с рекурсия void print (t){ if ( empty (t)) return ; print ( left (t )); cout << root (t); print ( right (t )); } void print (t){ stack. push (t); while (! empty ( stack )){ x = stack. pop (); if ( x is a number ) cout << x; else { stack. push ( left (x )); stack. push ( root (x )); stack. push ( right (x ));} } } Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 31 / 35
Обхождания Отпечатване чрез стек 50 30 90 45 70 99 20 T 20 <<30 T 30 T 45 <<50 <<50 T 50 T 90 T 90 <<20 <<30 T 45 <<50 T 90 void print (t){ stack. push (t); while (! empty ( stack )){ x = stack. pop (); if ( x is a number ) cout << x; else { stack. push ( left (x )); stack. push ( root (x )); stack. push ( right (x ));} } } <<45 <<50 T 90 T 70 <<90 T 99 <<70 <<90 T 99 <<99 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 32 / 35
Обхождания Обхождане с с опашка Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 33 / 35
Обхождания Обхождане с опашка 50 30 90 20 45 70 99 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 34 / 35
Обхождания Въпроси? Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 35 / 35