Shrnutí na Binární vyhledávací strom

Binární Vyhledávací Strom: Komplexní průvodce pro studenty

Binární vyhledávací strom

Binární vyhledávací strom (zkráceně BST z anglického Binary Search Tree) je fundamentální datová struktura v informatice. Slouží k efektivnímu ukládání a organizaci dat, což umožňuje rychlé vyhledávání, vkládání a mazání prvků. Jedná se o speciální typ binárního stromu, který se řídí přesnými pravidly pro uspořádání hodnot v uzlech, a právě tato pravidla mu propůjčují jeho unikátní vyhledávací schopnosti.

Základní pojmy a vlastnosti

Binární strom je hierarchická datová struktura, která se skládá z uzlů. Každý uzel v binárním stromu může mít nanejvýš dva potomky, které obvykle nazýváme levý potomek a pravý potomek.

Uzel (Node): Základní stavební blok stromové struktury, který obsahuje hodnotu a odkazy na své potomky (pokud existují).

List (Leaf): Uzel, který nemá žádné potomky.

Kořen (Root): Uzel, který nemá žádného rodiče; je to vstupní bod do stromu.

Rodič (Parent): Uzel, který má přímé potomky.

Potomek (Child): Uzel, který má rodiče. Každý uzel kromě kořene má právě jednoho rodiče.

Podstrom (Subtree): Libovolný uzel a všichni jeho potomci, tvořící samostatný binární strom.

Klíčová vlastnost binárního vyhledávacího stromu spočívá v uspořádání hodnot uzlů. Pro každý uzel $U$ ve stromu platí následující pravidla:

  1. Všechny hodnoty v levém podstromu uzlu $U$ jsou menší než hodnota uzlu $U$ samotného.
  2. Všechny hodnoty v pravém podstromu uzlu $U$ jsou větší než hodnota uzlu $U$ samotného.
  3. Levý i pravý podstrom uzlu $U$ jsou samy o sobě binárními vyhledávacími stromy.

Tato uspořádávací vlastnost zajišťuje, že data jsou ve stromu logicky organizována, což umožňuje logaritmickou časovou složitost pro většinu operací, pokud je strom vyvážený.

💡 Věděli jste?Zajímavost: Pokud do BST vkládáte prvky v seřazeném pořadí (např. $1, 2, 3, 4, 5$), strom zdegeneruje na lineární strukturu (spojový seznam), což výrazně zhorší jeho výkon na $O(N)$ namísto očekávaného $O(\log N)$.

Reprezentace uzlu

Typicky je uzel binárního vyhledávacího stromu reprezentován strukturou, která obsahuje:

  • Hodnotu (Data): Uložená data v uzlu.
  • Odkaz na levého potomka (Left Child): Ukazatel na kořen levého podstromu.
  • Odkaz na pravého potomka (Right Child): Ukazatel na kořen pravého podstromu.
struct Node {
    int data;
    struct Node *left;
    struct Node *right;
};

Operace na binárním vyhledávacím stromu

Binární vyhledávací stromy podporují několik základních operací, které jsou klíčové pro jejich efektivní použití.

Hledání (Vyhledávání)

Hledání prvku s danou hodnotou $X$ v BST začíná u kořene stromu. Algoritmus postupuje rekurzivně nebo iterativně následovně:

  1. Porovnejte $X$ s hodnotou aktuálního uzlu $U$.
  2. Pokud se $X$ rovná hodnotě $U$, prvek byl nalezen.
  3. Pokud je $X$ menší než hodnota $U$, pokračujte v hledání v levém podstromu uzlu $U$.
  4. Pokud je $X$ větší než hodnota $U$, pokračujte v hledání v pravém podstromu uzlu $U$.
  5. Pokud se dostanete k prázdnému podstromu (tj. aktuální uzel je null), prvek ve stromu není.

Příklad hledání: Hledání hodnoty $25$ ve stromu s kořenem $50$.

  • $25 < 50$, jdeme doleva.
  • Aktuální uzel je $30$. $25 < 30$, jdeme doleva.
  • Aktuální uzel je $20$. $25 > 20$, jdeme doprava.
  • Aktuální uzel je $25$. $25 = 25$, hodnota nalezena.

Vkládání (Insert)

Vkládání nové hodnoty $X$ do BST se provádí podobně jako hledání. Začíná se u kořene a postupuje se dolů stromem, dokud se nenajde vhodné místo pro vložení nového uzlu jako listu.

  1. Začněte u kořene stromu.
  2. Porovnejte $X$ s hodnotou aktuálního uzlu $U$.
  3. Pokud je $X$ menší než hodnota $U$:
    • Pokud má $U$ levého potomka, pokračujte vlevo.
    • Pokud $U$ nemá levého potomka, vložte $X$ jako levého potomka uzlu $U$ a operace je dokončena.
  4. Pokud je $X$ větší než hodnota $U$:
    • Pokud má $U$ pravého potomka, pokračujte vpravo.
    • Pokud $U$ nemá pravého potomka,
Zaregistruj se pro celé shrnutí
KartičkyTest znalostíShrnutíPodcastMyšlenková mapa
Začni zdarma

Už máš účet? Přihlásit se

Binární vyhledávací stromy

Klíčová slova: Binární vyhledávací strom, Binární vyhledávací stromy

Klíčové pojmy: BST je hierarchická datová struktura pro efektivní ukládání a organizaci dat., Pro každý uzel v BST platí: levý potomek < rodič < pravý potomek., Hledání prvku začíná od kořene a postupuje se doleva nebo doprava podle porovnání s aktuální hodnotou uzlu., Vkládání nového prvku se provádí jako hledání, dokud se nenajde prázdné místo pro vložení jako list., Mazání uzlu má tři případy: list, uzel s jedním potomkem, uzel se dvěma potomky., Uzel se dvěma potomky se maže nahrazením inorder následníkem (nebo předchůdcem) a následným smazáním původního následníka/předchůdce., Časová složitost většiny operací v BST je $O(\log N)$ pro vyvážený strom, ale $O(N)$ pro degenerovaný strom., Kořen je uzel bez rodiče, list je uzel bez potomků., Podstrom je libovolný uzel a všichni jeho potomci., Kritické je zachování vlastností BST při každé operaci., Simulace pomáhají pochopit dynamické chování stromu.

# Binární vyhledávací strom Binární vyhledávací strom (zkráceně **BST** z anglického Binary Search Tree) je fundamentální datová struktura v informatice. Slouží k **efektivnímu ukládání a organizaci dat**, což umožňuje rychlé vyhledávání, vkládání a mazání prvků. Jedná se o speciální typ binárního stromu, který se řídí přesnými pravidly pro uspořádání hodnot v uzlech, a právě tato pravidla mu propůjčují jeho unikátní vyhledávací schopnosti. ## Základní pojmy a vlastnosti Binární strom je hierarchická datová struktura, která se skládá z **uzlů**. Každý uzel v binárním stromu může mít nanejvýš dva potomky, které obvykle nazýváme **levý potomek** a **pravý potomek**. > **Uzel (Node):** Základní stavební blok stromové struktury, který obsahuje hodnotu a odkazy na své potomky (pokud existují). > **List (Leaf):** Uzel, který nemá žádné potomky. > **Kořen (Root):** Uzel, který nemá žádného rodiče; je to vstupní bod do stromu. > **Rodič (Parent):** Uzel, který má přímé potomky. > **Potomek (Child):** Uzel, který má rodiče. Každý uzel kromě kořene má právě jednoho rodiče. > **Podstrom (Subtree):** Libovolný uzel a všichni jeho potomci, tvořící samostatný binární strom. Klíčová vlastnost binárního vyhledávacího stromu spočívá v **uspořádání hodnot** uzlů. Pro každý uzel $U$ ve stromu platí následující pravidla: 1. Všechny hodnoty v **levém podstromu** uzlu $U$ jsou **menší** než hodnota uzlu $U$ samotného. 2. Všechny hodnoty v **pravém podstromu** uzlu $U$ jsou **větší** než hodnota uzlu $U$ samotného. 3. Levý i pravý podstrom uzlu $U$ jsou samy o sobě binárními vyhledávacími stromy. Tato uspořádávací vlastnost zajišťuje, že data jsou ve stromu logicky organizována, což umožňuje logaritmickou časovou složitost pro většinu operací, **pokud je strom vyvážený**. Zajímavost: Pokud do BST vkládáte prvky v seřazeném pořadí (např. $1, 2, 3, 4, 5$), strom zdegeneruje na lineární strukturu (spojový seznam), což výrazně zhorší jeho výkon na $O(N)$ namísto očekávaného $O(\log N)$. ### Reprezentace uzlu Typicky je uzel binárního vyhledávacího stromu reprezentován strukturou, která obsahuje: * **Hodnotu (Data):** Uložená data v uzlu. * **Odkaz na levého potomka (Left Child):** Ukazatel na kořen levého podstromu. * **Odkaz na pravého potomka (Right Child):** Ukazatel na kořen pravého podstromu. ```c struct Node { int data; struct Node *left; struct Node *right; }; ``` ## Operace na binárním vyhledávacím stromu Binární vyhledávací stromy podporují několik základních operací, které jsou klíčové pro jejich efektivní použití. ### Hledání (Vyhledávání) Hledání prvku s danou hodnotou $X$ v BST začíná u kořene stromu. Algoritmus postupuje rekurzivně nebo iterativně následovně: 1. Porovnejte $X$ s hodnotou aktuálního uzlu $U$. 2. Pokud se $X$ rovná hodnotě $U$, prvek byl nalezen. 3. Pokud je $X$ menší než hodnota $U$, pokračujte v hledání v levém podstromu uzlu $U$. 4. Pokud je $X$ větší než hodnota $U$, pokračujte v hledání v pravém podstromu uzlu $U$. 5. Pokud se dostanete k prázdnému podstromu (tj. aktuální uzel je `null`), prvek ve stromu není. **Příklad hledání:** Hledání hodnoty $25$ ve stromu s kořenem $50$. * $25 < 50$, jdeme doleva. * Aktuální uzel je $30$. $25 < 30$, jdeme doleva. * Aktuální uzel je $20$. $25 > 20$, jdeme doprava. * Aktuální uzel je $25$. $25 = 25$, hodnota nalezena. ### Vkládání (Insert) Vkládání nové hodnoty $X$ do BST se provádí podobně jako hledání. Začíná se u kořene a postupuje se dolů stromem, dokud se nenajde vhodné místo pro vložení nového uzlu jako listu. 1. Začněte u kořene stromu. 2. Porovnejte $X$ s hodnotou aktuálního uzlu $U$. 3. Pokud je $X$ menší než hodnota $U$: * Pokud má $U$ levého potomka, pokračujte vlevo. * Pokud $U$ nemá levého potomka, vložte $X$ jako levého potomka uzlu $U$ a operace je dokončena. 4. Pokud je $X$ větší než hodnota $U$: * Pokud má $U$ pravého potomka, pokračujte vpravo. * Pokud $U$ nemá pravého potomka,