Дървета. Калин Георгиев. 20 октомври 2016 г. Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 1 / 35

Размер: px
Започни от страница:

Download "Дървета. Калин Георгиев. 20 октомври 2016 г. Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 1 / 35"

Препис

1 Дървета Калин Георгиев 20 октомври 2016 г. Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 1 / 35

2 Интуиция Интуиция. Йерархична структура от данни Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 2 / 35

3 Интуиция Фамилно дърво баща ниво (етаж) 0 син 1 син 2 ниво 1 внук 1 внук 2 внук 3 ниво 2 правнук 1 ниво 3 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 3 / 35

4 Интуиция Фамилно дърво родител, наследник корен листо път ниво баща ниво (етаж) 0 син 1 син 2 ниво 1 внук 1 внук 2 внук 3 ниво 2 правнук 1 ниво 3 Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 4 / 35

5 Интуиция Decision Tree мъж Мъж или жена под 18 години? под 18 години? Barbie Харесва ли Поп музика Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 5 / 35 Спортува ли? да Плакат на Metallica Лакове и червила харесва ли Star Wars? харесва ли Star Wars? Въже за скачане да не не да Лазерен меч Количка с дистанционно Щанга Робот BB-8

6 Интуиция Формална дефиниция и абстракция Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 6 / 35

7 Дефиниция Дефиниции Свързан неориентиран граф без цикли Индуктивна дефиниция Фиксираме елемент () / 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

8 Дефиниция Дърво с числа Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 8 / 35

9 Дефиниция Двоично наредено дърво 50 < < < < X Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 9 / 35

10 Представяне и операции Представяне Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 10 / 35

11 Представяне и операции Тройна кутия Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 11 / 35

12 Представяне и операции Операции Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 12 / 35

13 Представяне и операции Добавяне на елемент Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 13 / 35

14 Представяне и операции Следа. Добавяне и намиране на елемент L R L LRL LRR Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 14 / 35

15 Представяне и операции Рекурсивни операции Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 15 / 35

16 Представяне и операции Търсене на елемент Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 16 / 35

17 Представяне и операции Проверка за принадлежност Среща ли се елементът 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

18 Представяне и операции Сума не елементите Каква е сумата на елементите на дървото? Празното дърво е дърво Ако 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

19 Представяне и операции Други прости рекурсивни операции Най-голям елемент в дървото Брой на елементитите в дървото Височина на дървото Брой на листата в дървото Празното дърво е дърво Ако 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

20 Представяне и операции x Сериализация Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 20 / 35

21 Двоични наредени дървета Операции с двоични наредени дървета Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 21 / 35

22 Двоични наредени дървета Вмъкване Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 22 / 35

23 Двоични наредени дървета Намиране на най-голям и най-малък елемент x y Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 23 / 35

24 Двоични наредени дървета Изтриване x < < y z Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 24 / 35

25 Двоични наредени дървета Изтриване x < < y z Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 25 / 35

26 Двоични наредени дървета Изтриване z < < y Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 26 / 35

27 Обхождания Обхождане с рекурсия VS. обхождане чрез стек Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 27 / 35

28 Обхождания Отпечатване Отпечатване с рекурсия void print (t){ if ( empty (t)) return ; print ( left (t )); cout << root (t); print ( right (t )); } Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 28 / 35

29 Обхождания Прецес на отпечатване 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 )) Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 29 / 35

30 Обхождания Прецес на отпечатване 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 октомври 2016 г. 30 / 35

31 Обхождания Отпечатване чрез стек Отпечатване с рекурсия 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

32 Обхождания Отпечатване чрез стек 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

33 Обхождания Обхождане с с опашка Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 33 / 35

34 Обхождания Обхождане с опашка Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 34 / 35

35 Обхождания Въпроси? Калин Георгиев Структури от данни и програмиране 20 октомври 2016 г. 35 / 35