Napište algoritmus pro implementaci binárního vyhledávacího stromu.

1. Vytvořte třídu pro uzly stromu obsahující hodnotu uzlu a ukazatele na levého a pravého potomka.
2. Vytvořte třídu pro binární vyhledávací strom obsahující ukazatel na kořen stromu.
3. Implementujte metodu pro vložení prvku do stromu:
   - Začněte od kořene a porovnejte hodnotu s aktuálním uzlem.
   - Pokud je hodnota menší než hodnota aktuálního uzlu, přesuňte se na levého potomka, jinak na pravého potomka.
   - Pokračujte v tomto procesu, dokud nenarazíte na prázdný uzel, do kterého vložíte nový uzel.
4. Implementujte metodu pro vyhledání prvku ve stromu:
   - Začněte od kořene a porovnejte hodnotu s aktuálním uzlem.
   - Pokud je hodnota shodná, vraťte uzel.
   - Pokud je hodnota menší než hodnota aktuálního uzlu, přesuňte se na levého potomka, jinak na pravého potomka.
   - Pokračujte v tomto procesu, dokud nenarazíte na prázdný uzel nebo nenajdete hledanou hodnotu.
5. Implementujte metodu pro odstranění prvku ze stromu:
   - Pokud uzel nemá potomky, odstraňte ho.
   - Pokud uzel má jednoho potomka, nahraďte uzel jeho potomkem.
   - Pokud uzel má oba potomky, najděte nejbližšího následníka (nejmenší hodnotu v pravém podstromu), nahraďte ho uzlem a odstraňte následníka.
6. Další funkce, které můžete implementovat, zahrnují průchod stromem (in-order, pre-order, post-order), zjištění výšky stromu, nalezení nejmenšího/největšího prvku atd.
def vložit(uzel, data): 
    # Pokud je strom prázdný, vrať nový uzel 
    if uzel is None: 
        return Uzel(data) 
  
    # Jinak pokračuj rekurzivně dolů stromem
    if data < uzel.data: 
        uzel.left = vložit(uzel.left, data) 
    else: 
        uzel.right = vložit(uzel.right, data) 
  
    # vrať (nezměněný) ukazatel na uzel 
    return uzel 
  
# Funkce pro vyhledání zadaných dat 
def hledat(uzel, data): 
      
    # Základní případ: pokud je kořen None nebo klíč je přítomen v kořeni 
    if uzel is None or uzel.data == data: 
        return uzel 
  
    # Klíč je větší než klíč kořene
    if uzel.data < data: 
        return hledat(uzel.right, data) 
  
    # Klíč je menší než klíč kořene
    return hledat(uzel.left, data)