Binární strom

Binární strom je nelineární datová struktura, ve které je každý prvek (uzel) spojen s nejvýše dvěma dalšími uzly, které označujeme jako levý syn a pravý syn.

Tato struktura se používá pro efektivní vyhledávání, třídění dat, reprezentaci hierarchií nebo při kompresi dat (např. Huffmanovo kódování).

Základní terminologie

Abychom pochopili práci se stromy, musíme definovat jejich části:

Kořen (Root): Nejvyšší uzel stromu, od kterého vše začíná. Nemá žádného rodiče.

Uzel (Node): Prvek stromu obsahující data a ukazatele na své potomky.

List (Leaf): Uzel, který nemá žádné potomky (nachází se na úplném konci větve).

Větev (Edge): Spojnice mezi dvěma uzly.

Hloubka (Výška): Počet úrovní od kořene k nejvzdálenějšímu listu.

Typy binárních stromů

V praxi se setkáváme s různými variantami podle toho, jak jsou uzly uspořádány:

Typ	Charakteristika
Plný binární strom	Každý uzel má buď 0, nebo 2 potomky (nikdy jen jednoho).
Vyvážený strom	Rozdíl výšek levého a pravého podstromu každého uzlu je minimální. Zajišťuje rychlé operace.
Binární vyhledávací strom (BST)	Pro každý uzel platí: všechny hodnoty v levém podstromu jsou menší a v pravém větší než hodnota uzlu.

Binární vyhledávací strom (BST)

BST (Binary Search Tree) je nejpoužívanější formou binárního stromu díky své efektivitě při vyhledávání.

Jak funguje vyhledávání v BST:

Představte si, že hledáte číslo 15:

1. Začnete u kořene (např. číslo **20**).
2. Protože 15 < 20, jdete do **levého** podstromu.
3. Narazíte na uzel s hodnotou **10**.
4. Protože 15 > 10, jdete do **pravého** podstromu.
5. Narazíte na uzel **15** – prvek nalezen.

Díky tomuto principu se při každém kroku eliminujeme polovinu zbývajících dat (podobně jako u binárního vyhledávání v poli).

Průchod stromem (Traversal)

Abychom mohli se všemi daty ve stromu pracovat (např. je vypsat), musíme stromem „projít“. Existují tři hlavní způsoby:

In-order (Levý-Kořen-Pravý): U BST vypíše data seřazená od nejmenšího po největší.

Pre-order (Kořen-Levý-Pravý): Vhodné pro kopírování stromu.

Post-order (Levý-Pravý-Kořen): Používá se například při mazání stromu (nejdříve se mažou potomci, pak rodič).

Výhody a nevýhody

Výhody:

Rychlost: Vyhledávání, vkládání a mazání je u vyvážených stromů velmi rychlé (logaritmická složitost).

Flexibilita: Strom se může dynamicky zvětšovat a zmenšovat.

Nevýhody:

Degenerace: Pokud vkládáme data již seřazená (1, 2, 3, 4…), strom se může změnit v „čáru“ (seznam), čímž ztrácí svou rychlost. To řeší tzv. samovyvažující se stromy (např. AVL nebo Red-Black stromy).

Související pojmy: B-strom, Indexování, Databáze, Algoritmus, Rekurze, Huffmanovo kódování.