Binární strom je datová struktura složená z uzlů, kde každý uzel může mít maximálně dva potomky: levý a pravý. Každý uzel obsahuje hodnotu a ukazatele na své potomky.
Plný binární strom - každý uzel má buď žádné, nebo právě dva potomky.
Dokonalý binární strom - všechny listy jsou na stejné úrovni a každý rodič má dva potomky.
Vyvážený binární strom - rozdíl mezi hloubkami levého a pravého podstromu každého uzlu je maximálně jedna.
Binární vyhledávací strom - levý potomek obsahuje menší hodnoty než rodič, pravý potomek větší (nebo rovny).
Vložení uzlu – nový prvek se vloží na správné místo
Vyhledání uzlu – hledáme, zda je ve stromu daná hodnota
Odstranění uzlu
Hledání minima a maxima – minimum je nejlevější uzel, maximum nejpravější.
Vyhledávání dat – Binární vyhledávací stromy umožňují efektivní vyhledávání s časovou složitostí O(log n).
Zpracování dat – Používá se např. v parserech programovacích jazyků.
Kompresi dat – Huffmanovo kódování využívá binární stromy ke kompresi souborů.
Databázové indexy – B-stromy, vycházející z binárních stromů, se používají k efektivnímu indexování dat.
Umělá inteligence – Herní strom pro hledání optimální strategie.
Sítě a grafika – Hierarchické struktury v renderingu a organizaci scén.
Vytvořte program v jazyce C++, který bude pracovat s binárním vyhledávacím stromem. Každý uzel stromu bude reprezentován strukturou obsahující:
hodnotu celého čísla (int),
ukazatel na levého potomka,
ukazatel na pravého potomka.
Vytvoření nové struktury uzlu
Definujte strukturu Node, která bude obsahovat hodnotu a ukazatele na levého a pravého potomka.
Vytvoření nového uzlu (Node* createNode(int value))
Implementujte funkci pro vytvoření nového uzlu.
Vkládání hodnoty do stromu (void insert(int value))
Implementujte funkci, která přidá nový uzel na správné místo podle pravidel binárního vyhledávacího stromu (menší hodnoty vlevo, větší vpravo).
Výpis hodnot ve stromu (inorder průchod) (void inorderTraversal(Node* node))
Implementujte funkci, která vypíše hodnoty ve stromu vzestupně.
Vyhledávání hodnoty ve stromu (bool search(int value))
Implementujte funkci, která zjistí, zda daná hodnota ve stromu existuje.
Odstranění uzlu (Node* deleteNode(Node* node, int value))
Implementujte funkci pro odstranění uzlu ze stromu se třemi případy:
Uzly bez potomků (přímo smažte).
Uzly s jedním potomkem (nahraďte potomkem).
Uzly se dvěma potomky (nahraďte nejmenší hodnotou z pravého podstromu).
Bonusové úkoly:
Implementujte funkci pro nalezení minimální a maximální hodnoty ve stromu.
Implementujte funkci pro určení výšky stromu.
Implementujte funkci pro iterativní vkládání prvků bez rekurze.