Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620



Podobné dokumenty
Binární vyhledávací stromy

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2013/2014 Radim Farana. Obsah. Strom

Algoritmy a datové struktury

Implementace binárního stromu směrníky

Abstraktní datové typy FRONTA

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Vyhledávací stromy. Slouží jako pomůcka pro organizaci dat umožňující efektivní vyhledávání.

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Definice. B-stromu. B-strom řádu m je strom, kde každý uzel má maximálně m následníků a ve kterém platí:

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

Programování v C++ 1, 16. cvičení

Radek Mařík

AVL stromy. pro každý uzel u stromu platí, že rozdíl mezi výškou jeho levého a pravého podstromu je nejvýše 1 stromy jsou samovyvažující

Algoritmy výpočetní geometrie

ADT STROM Lukáš Foldýna

Stromy, haldy, prioritní fronty

Základní datové struktury III: Stromy, haldy

Semestrální práce 2 znakový strom

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA)

Dynamické datové struktury III.

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Dynamické datové struktury IV.

Binární vyhledávací stromy pokročilé partie

Binární Vyhledávací Stromy, u kterých je. složitost operací v nejhorším. rovná O(log n)

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

Implementace aritmetického stromu pomocí směrníků

autoři: Rudolf Bayer, Ed McCreight všechny vnější uzly (listy) mají stejnou hloubku ADS (abstraktní datové struktury)

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

Datový typ prioritní fronta Semestrální práce z předmětu 36PT

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Dynamické datové struktury II.

Red Black strom (Red Black Tree) Úvod do programování. Rotace. Red Black strom. Rotace. Rotace

Lineární spojový seznam (úvod do dynamických datových struktur)

Časová a prostorová složitost algoritmů

Radomíra Duží L Datový typ množina

Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

Prioritní fronta, halda

Předmět: Algoritmizace praktické aplikace

a) b) c) Radek Mařík

Algoritmizace I. Ak. rok 2015/2016 vbp 1. ze 132

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

Dynamické datové typy a struktury

ABSTRAKTNÍ DATOVÉ TYPY

Stromy. Jan Hnilica Počítačové modelování 14

Výroková a predikátová logika - III

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

TGH07 - Chytré stromové datové struktury

Datové struktury Úvod

Náznak ukázky syntaxe a sémantiky pro projekt. 1 Syntaktické prvky. Poslední aktualizace: 8.

Základy algoritmizace c2007 Michal Krátký, Jiří Dvorský 1/57

bfs, dfs, fronta, zásobník, prioritní fronta, halda

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

5 Rekurze a zásobník. Rekurzivní volání metody

Operace na datových strukturách

ADT prioritní fronta. Haldy. Další operace nad haldou. Binární halda. Binomické stromy. Časová složitost jednotlivých operací.

Manuál k tvorbě absolventské práce

Rekurzivní algoritmy

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Implementace LL(1) překladů

Datové typy a struktury

NPRG030 Programování I, 2018/19 1 / :03:07

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

Homer. prvky. délka. přední 0 zadní 4. Použití fronty BUS STOP. 3 Lisa. 2 Bart. 4 Maggie. 1 Marge. Grafické znázornění předchozí animace:

Kapitola 11: Indexování a hešování. Základní představa

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

TÉMATICKÝ OKRUH TZD, DIS a TIS

Konstruktory a destruktory

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

bfs, dfs, fronta, zásobník, prioritní fronta, halda

TGH07 - Chytré stromové datové struktury

4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.

Pokročilá algoritmizace amortizovaná složitost, Fibonacciho halda, počítačová aritmetika

Reprezentace dat v informačních systémech. Jaroslav Šmarda

TÉMATICKÝ OKRUH Počítače, sítě a operační systémy

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

Přednáška 2. Systémy souborů OS UNIX. Nástroje pro práci se souborovým systémem. Úvod do Operačních Systémů Přednáška 2

BINARY SEARCH TREE

Anotace. Jednotky (tvorba a využití), struktury (typ record),

Spojová implementace lineárních datových struktur

Výroková a predikátová logika - II

3 Algoritmy řazení. prvku a 1 je rovněž seřazená.

vyhledávací stromové struktury

Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Výroková a predikátová logika - IV

Binární soubory (datové, typované)

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

Transkript:

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620 1. Vymezení pojmů Strom: Strom je takové uspořádání prvků - vrcholů, ve kterém lze rozeznat předchůdce - rodiče a následovníky - syny. Každý prvek - vrchol, může mít nejvýše jednoho předchůdce a několik následovníků. Kořen: Kořenem nazýváme takový prvek - vrchol, který nemá předchůdce. V každém stromu se nachází jen jeden kořen. Listy: Listy jsou takové prvky - vrcholy, které nemají žádného následovníka. Má-li strom jen jeden prvek - vrchol, je tento kořenem i listem zároveň. Binární strom: Každý prvek - vrchol stromu má nejvýše dva následovníky. Binární vyhledávací strom: Je binární strom, pro jehož každý uzel platí, že jeho levý podstrom je buď prázdný, nebo sestává z uzlů, hodnoty jejichž klíčů jsou menší než hodnota klíče daného uzlu. Podobně jeho pravý podstrom je buď prázdný, nebo sestává z uzlů, hodnoty jejichž klíčů jsou větší než hodnota klíče daného uzlu. Příklad binárního vyhledávacího stromu (obr.1) obr.1 Stručně: - každý prvek stromu = vrchol - vrchol '8' = kořen - vrcholy '1', '4', '7', '13' = listy - všechny vrcholy nalevo od kořene jsou menší než kořen - všechny vrcholy napravo od kořene jsou větší než kořen - stejný princip řazení platí u všech uzlů celého stromu 2. Realizace binárního vyhledávací stromu pomocí dynamických datových struktur

Velikost stromu nemusí být konečná, proto se pro realizaci velmi často využívá dynamických datových struktur. Dynamický datový typ definovaný pro tuto realizaci má dvě části, datovou a vazební - stejně jako například při realizaci seznamu dynamickou proměnnou. Rozdíl v proměnné, použité u binárního stromu, je pouze ten, že vazební část neobsahuje jeden ukazatel ale dva (každý uzel binárního stromu má právě dva syny). První ukazatel je vazbou na levého syna uzlu, druhý ukazatel je vazbou na pravého syna uzlu. V této nejjednodušší podobě pak lze takový dynamický datový prvek deklarovat například takto: Type TStrom=^vrchol; vrchol = record hodnota: Integer; levy, pravy: TStrom hodnota - data vrcholu levy, pravy - ukazatelé na syny Schématický popis realizace binárního vyhledávacího stromu z 'obr.1' pomocí dynamické datové struktury je na 'obr.2'. obr.2 Při vlastním použití takto deklarované dynamické proměnné je pak 'ukazatel vlevo' vazbou na syna s nižší hodnotu, 'ukazatel vpravo' pak vazbou na syna s vyšší hodnotou. Pokud uzel nemá syna pak nabývá ukazatel hodnoty NILL (stejně jako konec při použití dynamické proměnné v lineárním seznamu).

3. Vkládání prvku do binárního vyhledávacího stromu Z výše popsaných pravidel binárního stromu je zřejmý i způsob vkládání prvků do stromu. Popišme proto pouze stručně v bodech možné stavy a způsob vložení prvku. a) Strom je prázdný - první prvek se stává kořenem, synové jsou NIL b1) Strom má kořen - pokud je nový prvek menší než kořen a levý syn kořene je NIL pak se nový prvek stává levým synem (stává se listem), jeho oba dva synové jsou NIL. b2) Strom má kořen - pokud je nový prvek větší než kořen a pravý syn kořene je NIL pak se nový prvek stává pravým synem (stává se listem), jeho oba dva synové jsou NIL. c) Strom má kořen, má i své syny - postupuje se rekurzivně směrem dolu po větvích stromu podle bodu b1) a b2) Příklad procedury vkládání do které se vstupuje s hodnotou prvku: Procedure PridejVrchol (n:integer; var T:TStrom); if T=nil then new(t); T^.hodnota:=n; T^.levy:=nil; T^.pravy:=nil; if n < T^.hodnota then PridejVrchol(n, T^.levy); if n > T^.hodnota then PridejVrchol(n, T^.pravy); //pokud je strom prázdný nebo je odkaz na syna NILL pak // nový vrchol // hodnota novému vrcholu // pravý i levý syn se novému vrcholu nastaví na NILL //pokud je vkládaný prvek menší než vrchol pak //se rekurzivně voláme že chceme vložit prvek vlevo //pokud je vkládaný prvek větší než vrchol pak //se rekurzivně voláme že chceme vložit prvek vpravo

4. Rušení vrcholu v binárního vyhledávacím stromu Rušení prvku - vrcholu v binárním vyhledávacím stromu se řeší opět rekurzivně. Metoda rušení vrcholu má tyto pravidla. a) vrchol je listem - vrchol se zruší a odkaz na tento vrchol se nahradí NIL b) vrchol je uprostřed stromu a má jednoho syna - vrchol se zruší, na jeho místo se přesune jeho syn c) vrchol je uprostřed stromu a má oba syny - zde jsou přípustná dvě možná řešení 1) vrchol se zruší a na jeho místo se přesune nejlevější pravý list 2) vrchol se zruší a na jeho místo se přesune nejpravější levý list Schematický popis rušení vrcholu, který má dva syny podle varianty 1) na' obr.3'a, 'obr.3b'' obr.3a obr.3b Schematický popis rušení vrcholu, který má dva syny podle varianty 2) na 'obr.4a' a 'obr.4b' obr.4a obr.4b

Příklad procedury rušení prvku: Procedure OdeberVrchol (n:integer; var T:TStrom); Function NahradMaxPravymZleva(var T: TStrom): Integer; if T^.pravy=nil then result:=t^.hodnota; KeSmazani:=T; T:=T^.levy; dispose(kesmazani); result:=nahradmaxpravymzleva(t^.pravy); //procedura rekurzivně hleda v levé části //prvek který je nejvíce vpravo //pokud ho najde pak //si zapamatuje hodnotu prvku //prvek si připraví ke smazání //pokud měl prvek levého syna pak jde na // jeho místo //a prvek připravený ke smazání se smaže //pokud nejsme ještě na posledním prvku //pak rekurzivně ještě dál vpravo if T<>NIL then //hledej pokud není konec větve if n<t^.hodnota then //jestliže je hledana hodnota menší tak //rekurzivně dolů doleva OdeberVrchol(n,T^.levy); if n>t^.hodnota then //jestliže je hledana hodnota větší tak //rekurzivně dolů doprava OdeberVrchol(n,T^.pravy); if (T^.levy=NIL) and (T^.pravy=NIL) then //pokud jsme hodnotu našli a je to list //pak se může přímo zrušit dispose(t); T:=NIL; if (T^.levy=NIL) then //pokud nemá leveho syna pak prvek smazat //a na jeho místo jeho pravý syn KeSmazani:=T; T:=T^.pravy; dispose(kesmazani); if (T^.pravy=NIL) then //pokud nemá pravého syna pak prvek smazat //a na jeho místo jeho levý syn KeSmazani:=T; T:=T^.levy; dispose(kesmazani); //pokud má prvek oba syny pak volat funkci T.hodnota:=NahradMaxPravymZleva(T.levy); //která najde nejlevější pravou prvek, //ten zruší a vrátí jeho hodnotu, kterou se //nahradí hledaná hodnota

Popis řešení. Procedura 'OdeberVrchol' se volá s hledanou hodnotou vrcholu. Spustí se rekurzivní prohledání stromu na přítomnost této hodnoty. Postupuje se rekurzivně dolu od kořene, podle pravidel binárního vyhledávacího stromu. Pokud není prvek nalezen neprovede se nic. Pokud je prvek nalezen a nemá žádného potomka pak je odstraněn. Pokud je prvek nalezen a má pouze jednoho syna pak se prvek přesune do dočasné proměnné 'KeSmazani' a jeho místo nahradí jeho syn. Pak je prvek v proměnné 'KeSmazani' odstraněn. Pokud je prvek nalezen a má oba potomky, pak se volá funkce 'NahradMaxPravymZleva'. Tato funkce vyhledá nejlevější pravý prvek. Pokud je tento prvek listem, pak tento list zruší a jeho hodnotu předá zpět proceduře. Procedura touto hodnotu nahradí hodnotu v prvku ke zrušení (s ukazateli se v tomto případě nemanipuluje). Pokud má ale tento nejpravější prvek levého syna, pak se na místo rušeného prvku přesune tento syn.