Научете за дърветата, полезна и широко използвана структура от данни, използвайки Python
Структурите от данни ни помагат да решаваме проблеми ефективно и елегантно. Досега обсъждахме списъци, опашки, стекове и т.н. Днес ще говорим за структурата на данните Дърво. Дърветата се използват широко в случаите, когато съхранените данни естествено образуват йерархия. Нещо повече, дърветата се използват в алгоритми за търсене като дървета за двоично търсене и алгоритми за сортиране като Heap Sort.
Съдържание
1. Introduction 2. Terminology 3. Traversies 4. Implementation 5. Conclusion
Въведение
Дървото е нелинейна йерархична структура от данни, която се състои от възли и ръбове като графика. Голямата разлика с графиките е, че дърветата не съдържат кръгове. Дървото се състои от набор от възли, свързани един с друг, създавайки обратно дърво (коренът отгоре и листата отдолу). Дърветата позволяват по-бърз и лесен достъп до данните в сравнение с други линейни структури от данни като масиви, свързани списъци и т.н. Дървото има следната форма:
Като цяло има три типа възли:
- Коренът: Най-горният възел на дървото (червен възел)
- Интервални възли: Възли, които имат родителски възел и поне дъщерен възел (сини възли)
- Листови възли: Възлите, които нямат дете (зелени възли)
Терминология
Имайки основна интуиция за дървовидната структура на данните, нека да разгледаме малко терминология за дърветата.
- Възел: Възелът (връх) като в графиките е обект, който съдържа данни.
- Edge: Връзка между два възела.
- Родителски възел: Всеки възел на дървото (с изключение на корена) има родителски възел, който е предшественик на възела.
- Дъщерен възел: Възелът, който е непосредствен наследник на възела, се нарича дъщерен възел.
- Братя и сестри: Възли, които имат един и същ родител.
- Поддърво: Всяко подмножество на дърво.
- Степен на възела: Общият брой разклонения (деца) на възел.
- Степен на дървото: максималната степен сред всички възли на дървото.
- Дълбочина на възел: Броят на ръбовете от корена до текущия възел.
- Височина на възел: Най-дългият път (брой ръбове) от текущия възел до лист.
- Височина на дърво: Височината на основния възел. Най-дългият път от корена до листа.
- Ниво на възел: Броят на ръбовете от корена до текущия възел. Коренът има ниво 0.
- Път: Последователността от възли от начален възел до целеви възел.
- Нулево дърво: Дърво без възли.
- Пълно двоично дърво: Двоично дърво, в което всеки родителски възел има или нула, или две деца.
- Пълно двоично дърво: Двоично дърво, в което всички нива (освен евентуално от последното) имат максималния брой възли. За последното ниво всички възли на листа трябва да се наклонят наляво.
Има няколковида дървета, като най-известните от тях са следните:
- Общо дърво: Дърво, в което всеки възел има от нула до безкраен брой деца.
- Двоично дърво: Дърво, в което всеки възел има най-много две деца (0, 1 или две)
- Балансирано дърво: Дървета, при които разликата между лявото и дясното поддърво е най-много 1.
- Двоично дърво за търсене: Това е двоично дърво със свойството, че във всеки възел i лявото дете на този възел има стойност, по-малка или равна на възел i, а дясното дете има стойност, по-голяма от възел i.
- Групи: Купчината е пълно двоично дърво, в което всеки родителски възел има по-голяма или равна стойност на своите деца (Макс. куп) или всеки родителски възел има по-малка или равна стойност на своите деца (Минимална купчина ).
В този урок ще говорим за двоични дървета.
Обхождания
Една от най-честите операции в едно дърво е обхождането. С термина обхождане на дърво имаме предвид да посетите всеки възел на дървото с конкретен предварително дефиниран ред. Тъй като дървото е йерархична структура от данни, има няколко начина за преминаване през дърво. По-конкретно, има три вида преминаване:
- Предварителна поръчка: Последователността на посещението следва модела Корен, ляв възел, десен възел. Да предположим например, че имаме следното двоично дърво:
Преминаването на предварителната поръчкае A — B — D — E — C — F
- По ред: Последователността на посещението следва модела ляв възел, корен и десен възел. Да предположим например, че имаме следното двоично дърво:
Обхождането вреде D— B — E— A— C — F
- Поръчка: Последователността на посещението следва модела Ляв възел, Десен възел, Корен. Да предположим например, че имаме следното двоично дърво:
Следпреминаването на поръчкае D — E— B— F— C — A
Внедряване
Имайки интуиция за дърветата и техните свойства, време е да кодирате с помощта на Python. Както беше споменато по-рано, дървото се състои от набор от възли. Така че първата ни работа е да създадем клас с име Node, който представлява всеки възел на дървото. Този клас ще има три атрибута. Атрибутът стойностсъответства на данните на възела, докато другите два атрибута left_childи right_chidсе наричат ляво и дясно дете на възела съответно. Освен това нашият клас ще бъде оборудван с метод за добавяне на деца към възела.
След това създаваме класа MyTreeкойто моделира дървовидната структура на данните. Този клас приема основния възел като параметър. Освен това, той е оборудван с необходимите методи (предварителна поръчка, подредба и последваща поръчка) за преминаване.
Накрая създаваме възлите и дървото и извикваме методите за преминаване. В нашия пример да предположим, че има следното дърво:
Забелязваме, че получаваме същите резултати като примерите с писалка и хартия по-горе.
Можете да разгледате и изтеглите целия код тук.
Заключение
В тази статия имахме възможността да говорим за дървета, една от най-фундаменталните структури от данни в компютърните науки. Дърветата се използват в различни области, в които данните имат естествена форма на йерархия. Освен това, няколко алгоритми за търсене като Binary Search Trees и алгоритми за сортиране като Heap Sort използват дървета. Ще разгледаме и двете неща в следващите статии. Благодаря за четенето.
Ако обичате да четете статиите ми, последвайте ме в LinkedIn и Twitter. Освен това можете да се регистрирате, за да станете член на Medium. Като член имате неограничен достъп до хиляди статии. Членството струва 5$ на месец. Можете да използвате следната връзка, за да станете среден член.
Повече съдържание в PlainEnglish.io. Регистрирайте се за нашия безплатен седмичен бюлетин. Следвайте ни в Twitter и LinkedIn. Вижте нашия Community Discord и се присъединете към нашия Talent Collective.