Datové struktury obsah přednášky 1. Úvod 2. Třídy Type-wrapper (obalový typ) pro primitivní typy automatické převody 3. Automatické převody mezi

Podobné dokumenty
Datové struktury obsah přednášky 1. Úvod 2. Třídy Type-wrapper (obalový typ) pro primitivní typy automatické převody 3. Automatické převody mezi

Datové struktury. alg12 1

Úvod do programovacích jazyků (Java)

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

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

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

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

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Dynamické datové struktury I.

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.

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

Abstraktní datové typy: zásobník

Algoritmy a datové struktury

Abstraktní datové typy

KTE / ZPE Informační technologie

Teoretické minimum z PJV

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

ADT/ADS = abstraktní datové typy / struktury

Spojové struktury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 10 A0B36PR1 Programování 1

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

Část I Spojové struktury

Konstruktory a destruktory

Programování v Javě I. Leden 2008

Programování v Javě I. Únor 2009

Základní datové struktury

Lineární datové struktury

Algoritmizace prostorových úloh

Principy objektově orientovaného programování

OOPR_05. Případové studie

Typický prvek kolekce pro české řazení

1. Téma 12 - Textové soubory a výjimky

IRAE 07/08 Přednáška č. 7. Začátek (head)

9. přednáška - třídy, objekty

Generické programování

Programování v C++ 2, 4. cvičení

Dynamické struktury a Abstraktní Datový Typy (ADT)

Dynamické datové struktury IV.

Část 1 Spojové struktury (stromy) Dynamické struktury a Abstraktní Datový Typy (ADT) Část 2 Abstraktní datový typ. Část 3 Příklad ADT Prioritní fronta

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

Java Výjimky Java, zimní semestr

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Seminář Java II p.1/43

Algoritmizace a programování

8 Třídy, objekty, metody, předávání argumentů metod

Kolekce, cyklus foreach

Algoritmizace prostorových úloh

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Soubor jako posloupnost bytů

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování v C++ 2, 7. cvičení

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

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

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

Spojové struktury. Spojová struktura (linked structure):

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Implementace abstraktních datových typů. Zásobník (Stack) Fronta (Queue) Obousměrná fronta (Dequeue) Vektor (Vector) Seznam (List)

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

RMI Remote Method Invocation

Úvod do programování - Java. Cvičení č.4

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Výčtový typ strana 67

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

Šablony, kontejnery a iterátory

PREPROCESOR POKRAČOVÁNÍ

7. Dynamické datové struktury

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

Java a XML. 10/26/09 1/7 Java a XML

Šablony, kontejnery a iterátory

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

typová konverze typová inference

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

20. Projekt Domácí mediotéka

Úvod do programovacích jazyků (Java)

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

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

prohled av an ı graf u Karel Hor ak, Petr Ryˇsav y 16. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Úvod do programovacích jazyků (Java)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

8. přednáška: Soubory a proudy

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

Java Řetězce Java, zimní semestr

Dědičnost (inheritance)

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

Java - výjimky. private void vstup() throws IOException {... }

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

ABSTRAKTNÍ DATOVÉ TYPY

17. Projekt Trojúhelníky

Přehled probírané látky

Transkript:

OOPR_11 1

Datové struktury obsah přednášky 1. Úvod 2. Třídy Type-wrapper (obalový typ) pro primitivní typy automatické převody 3. Automatické převody mezi primitivními a obalovými typy 4. Třídy odkazující sama na sebe (self referential) 5. Dynamické přidělování paměti 6. Spojové seznamy 7. Zásobníky 8. Fronty 9. Stromy 2

Úvod 3 Statické datové struktury typ array, jedno vícerozměrné (matice), spojové seznamy kolekce dat, kde rozšíření / zmenšení seznamu, je provedeno kdykoli za běhu programu.

Třídy Type-Wrapper pro primitivní typy (obalový typ) 4 primitivní typy a objektové typy na primitivní typy se nedá odkazovat referencí každý primitivní typ má odpovídající třídu type wrapper obalovou třídu v balíčku (java.lang) třídy type-wrapper jsou: Boolean, Byte, Character, Double, Float, Integer, Long, Short třídy type wrapper (obalové třídy) nemohou manipulovat s proměnnými primitivních typů jako s objekty, ale dovolují manipulovat s objekty typových obalových tříd

Třídy Type-Wrapper pro primitivní typy (obalový typ) 5 Každá z type wrapper tříd (obalových tříd) je podtřídou třídy Number třídy type wrapper jsou final třídy, nemohou mít podtřídy (extends)

Automatické převody mezi primitivními a obalovými typy 6 třídy type wrapper jsou nutné pro ukládání primitivních typů do kolekcí předchozí verze Javy Integer[] integerarray = new Integer[5]; integerarray[0] = new Integer(10); int value = integerarray[0].intvalue(); Java verze 5.0 Integer[] integerarray = new Integer[5]; integerarray[0] = 10; int value = integerarray[0];

// drivejsi prirazeni public static void drive() int i2 = 12; Integer ctyri = new Integer(2 * i2); int i6 = 2*ctyri.intValue();... Osnova 7 public static void nyni() int i2 = 2; Integer ctyri = 2 * i2; int i6 = 2 + ctyri;...

Třídy Self Referential (třídy odkazující se na své prvky) obsahují objekt, který odkazuje na jiný objekt stejné třídy class Uzel private int data; //datový atribut i objektový typ private Uzel nextuzel; //referenční atribut 8 public Uzel(int data) // konstruktor public void setdata(int data) //metody - datové atributy public int getdata() public void setnext( Uzel next) //metody ref. atributy public Uzel getnext()

Třídy odkazující se sami na sebe 9 15 10 Self-referential-class objects spojené k sobě

Dynamické přidělení paměti 10 vytváření a manipulace s dynamickými datovými strukturami vyžaduje dynamické přidělení paměti schopnost programu získat za běhu programu paměťový prostor a posléze ho uvolnit (není-li třeba) Java automaticky čistí paměť od již nepotřebných objektů (nejsou na ně odkazy) Node nodetoadd = new Node(10);

Spojové seznamy 11 Spojový seznam Lineární kolekce samoodkazujících tříd (uzlů) Propojení pomocí odkazů Uzly mohou být vkládány nebo rušeny kdekoli ve spojovém seznamu Poslední uzel ukazuje na null (k označení konce Poslední uzel ukazuje na null (k označení konce seznamu)

Spojové seznamy 12 firstnode lastnode H D... Q Spojový seznam grafická reprezentace

public class Uzel private Object data; //datovy atribut private Uzel dalsiuzel; // referencni atribut Osnova // konstruktor vytvarejici uzel, vazba na object public Uzel( Object object ) this( object, null ); // konstruktor tvorici uzel s vazbou na dalsi uzel public Uzel( Object object, Uzel node ) data = object; dalsiuzel = node; // pristup k datove slozce uzlu public Object getdata() // vraci atribut data daneho uzlu return data; public Uzel getdalsiuzel() // dej dalsi uzel return dalsiuzel; public void setdalsiuzel(uzel nuzel) dalsiuzel = nuzel;

Diagram tříd 14

public class EmptyListException extends RuntimeException // konstruktor bez parametru public EmptyListException() // vola jiny mkonstruktor EmptyListException this( "Spojovy seznam" ); Osnova Třída EmptyListException // konstruktor s jednim parametrem public EmptyListException( String name ) super( name + " je prazdny" ); // vola konstruktor nadtridy

Třída SpojovySeznam 16 Tato třída je vlastně tvůrcem spojového seznamu a využívá ke své činnosti dříve deklarovanou třídu Uzel. Má tří datové atributy. První dva ukazují na začátek resp. konec První dva ukazují na začátek resp. konec spojového seznamu a třetím datovým atributem je jméno spojového seznamu.

Třída SpojovySeznam 17 Nejdůležitějšími metodami této třídy jsou čtyři metody: insertatfront() vloží uzel na začátek spojového seznamu, insertatback() vloží uzel na konec spojového seznamu, removefromfront() odebere a tím odstraní uzel ze začátku spojového seznamu, removefromback() odebere a tím odstraní uzel z konce spojového seznamu.

Třída SpojovySeznam 18 Spojovým seznamem můžeme procházet jednosměrně, proto je operace removefromback() obtížnější. Úpravu spojového seznamu musíme začít od prvního uzlu a pokračovat ovat rekurzivně až na poslední uzel.

Spojové seznamy 19 (a) firstnode 7 11 new Listnode 12 (b) firstnode 7 11 new Listnode 12

Spojové seznamy 20 (a) firstnode lastnode new Listnode 12 7 11 5 (b) firstnode lastnode new Listnode 12 7 11 5

Spojové seznamy 21 (a) firstnode lastnode 12 7 11 5 (b) firstnode lastnode 12 7 11 5 removeitem

public class SpojovySeznam private Uzel prvniuzel; private Uzel posledniuzel; private String jmeno; // nazev seznamu pro tisk Osnova // konstruktor tvorici prazdny seznam se jmenem list public List() this( "Spojovy seznam" ); // konstruktor tvorici prazdny seznam se zadanym jmenem public SpojovySeznam( String jmenoseznamu ) jmeno = jmenoseznamu; prvniuzel = posledniuzel = null; // vlozi Object na zacatek seznamu public void insertatfront( Object insertitem ) // prvniuzel a posledniuzel odkazuji na stejny objekt if ( isempty() ) prvniuzel = posledniuzel = new Uzel( insertitem ); else // prvniuzel odkazuje na novy uzel prvniuzel = new Uzel( insertitem, prvniuzel );

// vlozi Object na konec seznamu (List) public void insertatback(object vlozenadata ) // prvniuzel a posledniuzel odkazuji na stejny Object if ( isempty() ) prvniuzel = posledniuzel = new Uzel( vlozenadata ); else Osnova // posledniuzel a jeho dalsiuzel odkazuje na novy uzel posledniuzel = posledniuzel.getdalsiuzel(); posledniuzel.setdalsiuzel(new Uzel(vlozenaData));

// odstran prvni uzel ze seznamu public Object removefromfront() throws EmptyListException if ( isempty() ) // throw exception if List is empty throw new EmptyListException( jmeno ); Osnova // zpristupneni odstranovanych dat Object odstranenadata = prvniuzel.getdata(); // aktualizace odkazu prvniuzel a posledniuzel if ( prvniuzel == posledniuzel ) prvniuzel = posledniuzel = null; else prvniuzel = prvniuzel.getdalsiuzel(); return odstranenadata; // vraci data odstraneneho uzlu

// odstraneni posledniho uzlu ze seznamu public Object removefromback() throws EmptyListException if ( isempty() ) // throw exception if List is empty throw new EmptyListException( jmeno ); Osnova // zpristupni data odstraneneho uzlu Object removeditem = posledniuzel.getdata(); // aktualizuje odkazy na prvnihouzel a posledniuzel if ( prvniuzel == posledniuzel ) prvniuzel = posledniuzel = null; else // umisti novy uzel jako poslední Uzel aktualni = prvniuzel; // cykluje dokud current uzel neodkazuje na // posledniuzel rekurze while ( aktualni.getdalsiuzel()!= posledniuzel ) aktualni = aktualni.getdalsiuzel(); // aktualni je novy posledniuzel posledniuzel = aktualni; aktualni.setdalsiuzel(null); // end else return removeditem; // end method removefromback

// zjisteni, zda je list prazdny public boolean isempty() return prvniuzel == null; Osnova // tisk seznamu (list) public void print() if ( isempty() ) System.out.printf( "Empty %s\n", jmeno ); return; System.out.printf( "The %s is: ", jmeno ); Uzel current = prvniuzel; // rekurze while ( current!= null ) System.out.printf( "%s ", current.getdata() ); current = current.getdalsiuzel(); System.out.println( "\n" );

public class SpojovySeznamTest public static void main(string[] args) SpojovySeznam list = new SpojovySeznam(); // vkladani celych cisel do seznamu list.insertatfront( -1 ); list.print(); list.insertatfront( 0 ); list.print(); list.insertatback( 1 ); list.print(); list.insertatback( 5 ); list.print(); Osnova Třída SpojovySeznamTest 1/2

// odstranovani prvku seznamu, tisk po kazde operaci try Object removedobject = list.removefromfront(); System.out.printf( "%s odstranen\n", removedobject ); list.print(); Osnova Třída SpojiovySeznamTest 2/2 removedobject = list.removefromfront(); System.out.printf( "%s odstranen\n", removedobject ); list.print(); removedobject = list.removefromback(); System.out.printf( "%s odstranen\n", removedobject ); list.print(); removedobject = list.removefromback(); System.out.printf( "%s odstranen\n", removedobject ); list.print(); // end try catch ( EmptyListException emptylistexception ) emptylistexception.printstacktrace(); // end catch

The list is: -1 The list is: 0-1 Osnova 29 The list is: 0-1 1 The list is: 0-1 1 5 0 removed The list is: -1 1 5-1 removed The list is: 1 5 5 removed The list is: 1 1 removed Empty list

Zásobníky - stacks 30 Zásobník Omezená verze spojového seznamu Přidává a odstraňuje uzly pouze z vrcholu zásobníku Metoda push přidává uzel na vrchol zásobníku Metoda pop odstraňuje uzel z vrcholu zásobníku

Dědičnost versus skládání (delegování) 31 Uživatelské kolekce můžeme vytvářet dvěma způsoby: s využitím dědičnosti s využitím skládání (delegování) Příkladem bude struktura zásobníku

// Dedicnost od tridy List public class StackInheritance extends List // bez parametricky konstruktor public StackInheritance() super( "stack" ); Osnova 32 Zásobník dědičnost // pridani objectu do zasobniku public void push( Object object ) insertatfront( object ); // odebrani objektu ze zasobniku public Object pop() throws EmptyListException return removefromfront();

public class StackInheritanceTest public static void main( String args[] ) StackInheritance stack = new StackInheritance(); Osnova 33 Třída ZasobnikTest // use push method stack.push( -1 ); stack.print(); stack.push( 0 ); stack.print(); stack.push( 1 ); stack.print(); stack.push( 5 ); stack.print(); // odebrani prvku ze zasobniku try Object removedobject = null;

while ( true ) removedobject = stack.pop(); // pouziti metody pop() System.out.printf( "%s popped\n", removedobject ); stack.print(); catch ( EmptyListException emptylistexception ) emptylistexception.printstacktrace(); // end main Osnova 34

The stack is: -1 The stack is: 0-1 Osnova 35 The stack is: 0 0-1 The stack is: 5 1 0-1 5 popped The stack is: 1 0-1 1 popped The stack is: 0-1 0 popped The stack is: -1-1 popped Empty stack struktury.emptylistexception: stack is empty at struktury.list.removefromfront(list.java:79) at struktury.stackinheritance.pop(stackinheritance.java:20) at struktury.stackinheritancetest.main (StackInheritanceTest.java:26)

// skladani, delegovani public class StackComposition private List stacklist; //datovy atribut seznam // konstruktor bez parametru public StackComposition() stacklist = new List( "stack" ); Osnova 36 Zásobník skládání, delegovani // pridani objectu do zasobniku public void push( Object object ) stacklist.insertatfront( object ); // odebrani objectu ze zasobniku public Object pop() throws EmptyListException return stacklist.removefromfront(); // zjisteni, zda je zasobnik prazdny public boolean isempty() return stacklist.isempty();

// tisk obsahu zasobniku public void print() stacklist.print(); Osnova 37

Fronty queues 38 Fronta Podobná frontě ze supermarketu u pokladny Uzly jsou vkládány pouze na konec (tail) Metoda enqueue Uzly jsou odstraňovány z čela fronty (head of the front) Metoda dequeue

// Class Queue. public class Queue private List queuelist; // datovy atribut seznam // bezparametricky konstruktor public Queue() queuelist = new List( "queue" ); Osnova 39 Fronta skládání, delegovani // pridani objectu do fronty public void enqueue( Object object ) queuelist.insertatback( object ); // odebrani objektu z fronty public Object dequeue() throws EmptyListException return queuelist.removefromfront(); // zjisteni, zda je fronta prazdne public boolean isempty() return queuelist.isempty();

// tisk obsahu fronty public void print() queuelist.print(); Osnova 40

public class QueueTest public static void main( String args[] ) Queue queue = new Queue(); Osnova 41 Třída FrontaTest // use enqueue method queue.enqueue( -1 ); queue.print(); queue.enqueue( 0 ); queue.print(); queue.enqueue( 1 ); queue.print(); queue.enqueue( 5 ); queue.enqueue( 5 ); queue.print();

// odebrani objektu z fronty try Object removedobject = null; Osnova 42 while ( true ) removedobject = queue.dequeue(); System.out.printf( "%s dequeued\n", removedobject ); queue.print(); catch ( EmptyListException emptylistexception ) emptylistexception.printstacktrace();

The queue is: -1 Osnova 43 The queue is: -1 0 The queue is: true -1 0 1 The queue is: -1 0 1 5-1 dequeued The queue is: 0 1 5 0 dequeued The queue is: 1 5 1 dequeued The queue is: 5 5 dequeued Empty queue struktury.emptylistexception: queue is empty at struktury.list.removefromfront(list.java:79) at struktury.queue.dequeue(queue.java:22) at struktury.queuetest.main(queuetest.java:26)

Stromy trees 44 Strom Nelineární, dvoudimenzionální datová struktura se speciálními vlastnostmi (spojové seznamy, zásobníky, fronty jsou lineární datové struktury) Uzly stromu obsahují dva nebo více odkazů (referencí) Kořenový uzel (Root node) je první uzel (počátek) Každá reference odkazuje na dítě (child) Levé dítě je prvním uzlem v levém podstromu (subtree) Pravé dítě je prvním uzlem v pravém podstromu Děti v uzlech se nazývají sourozenci (siblings) Uzly, které nemají pokračování (děti) jsou uzly listů (leaf nodes)

Stromy - pokračování 45 Binary search tree Speciální řazení uzlů bez duplikátů (hodnot uzlů) Hodnoty v levých podstromech jsou menší než hodnoty v pravých podstromech Inorder traversal - průchod Prochází levý podstrom, získá hodnotu uzlu, prochází pravý podstrom Preorder traversal - průchod Získá datový atribut uzlu, prochází levý podstrom, prochází pravý podstrom Postorder traversal - průchod Prochází levý podstrom, prochází pravý podstrom, získá datový atribut (hodnotu) uzlu

Stromy - pokračování 46 B A D C Binární strom grafická reprezentace.

Diagram tříd 47

Stromy - pokračování 48 47 25 77 11 43 65 93 7 17 31 44 68 Binary search tree obsahující 12 hodnot.

public class UzelStromu private UzelStromu levyuzel; private int data; // hodnota, objekt uzlu private UzelStromu pravyuzel; Osnova // konstruktor, inicializace datoveho atributu public UzelStromu( int datauzlu ) data = datauzlu; levyuzel = pravyuzel = null; // uzly nemaji deti public UzelStromu getlevyuzel() return levyuzel; public int getdata() return data; public UzelStromu getpravyuzel() return pravyuzel;

// nalezne bod pro vlozani a vlozi novy uzel; // ignoruje duplikovane hodnoty public void insert( int vkladanahodnota ) Osnova // vlozi do leveho podstromu if ( vkladanahodnota < data ) // vlozi novy UzelStromu if ( levyuzel == null ) levyuzel = new UzelStromu( vkladanahodnota ); else // pokracuje v traverzovani leveho podstromu levyuzel.insert( vkladanahodnota ); // end if //vkladani do praveho podstromu else if ( vkladanahodnota > data ) // vlozi new UzelStromu if ( pravyuzel == null ) pravyuzel = new UzelStromu( vkladanahodnota ); else // pokracuje v traverzovani praveho podstromu pravyuzel.insert( vkladanahodnota ); // end else if // end metody insert

Třída Strom 51 Tato třída deklaruje jen jeden datový atribut a tím je odkaz na kořen stromu (root). Z tohoto bodu se odvíjí všechny požadované operace, tedy operace pro vložení nového uzlu stromu a operace průchodu stromem. Třída dále deklaruje konstruktor a metodu vlozituzel().

public class Strom private UzelStromu root; // konstruktor inicializuje prazdny strom celych cisel public Strom() root = null; Osnova // vlozi novy uzel do binarne prohledavaneho stromu public void vlozituzel( int vkladanahodnota ) if ( root == null ) // zde vytvori uzel root root = new UzelStromu( vkladanahodnota ); else root.insert( vkladanahodnota ); // end metody vlozituzel // zacatek pruchodu preorder public void preordertraversal() preorderhelper( root );

// recursivni metoda ktera provadi pruchod preorder private void preorderhelper( UzelStromu node ) if ( node == null ) return; Osnova // vystup dat.atributu uzlu System.out.printf( "%d ", node.getdata()); // pruchod levym podstromem preorderhelper( node.getlevyuzel() ); // pruchod pravym podstromem preorderhelper( node.getpravyuzel() ); // konec metody preorderhelper() // zacatek pruchodu inorder public void inordertraversal() inorderhelper( root ); // end metody inordertraversal

// recursivni metoda ktera provadi pruchod inorder private void inorderhelper( UzelStromu node ) if ( node == null ) return; Osnova // pruchod levym podstromem inorderhelper( node.getlevyuzel() ); // vystup dat.atributu uzlu System.out.printf( "%d ", node.getdata() ); // pruchod pravym poduzlem inorderhelper( node.getpravyuzel() ); // zacatek pruchodu postorder public void postordertraversal() postorderhelper( root );

// rekursivni metoda pro pruchod postorder (traversal) private void postorderhelper( UzelStromu node ) if ( node == null ) return; Osnova // pruchod levym podstromem postorderhelper( node.getlevyuzel() ); // pruchod pravym podstromem postorderhelper( node.getpravyuzel() ); // vystup dat.atributu uzlu System.out.printf( "%d ", node.getdata() );

import java.util.random; public class StromTest public static void main(string[] args) Strom tree = new Strom(); int value; Random randomnumber = new Random(); System.out.println("Inserting the following values: " ); Osnova // vloz 10 nahodnych celych cisel od 0-99 do stromu for ( int i = 1; i <= 10; i++ ) value = randomnumber.nextint( 100 ); System.out.print( value + " " ); tree.vlozituzel( value ); System.out.println ( "\n\npruchod preorder" ); // vykona pruchod preorder stromem tree.preordertraversal(); System.out.println ( "\n\npruchod inorder" ); // vykona pruchod inorder stromem tree.inordertraversal(); System.out.println ( "\n\npruchod postorder" ); // vykona pruchod postorder stromem tree.postordertraversal(); System.out.println();

Ověření na datech 57 Řada hodnot: 92, 73, 77, 16, 30, 30, 94, 89, 26, 80. Pak bude mít vytvořený binární strom podle uvedených programů následující strukturu:

Osnova 58 Vlkadane ciselne hodnoty: 92 73 77 16 30 30 94 89 26 80 Pruchod preorder 92 73 16 30 26 77 89 80 94 Pruchod inorder 16 26 30 73 77 80 89 92 94 Pruchod postorder 26 30 16 80 89 77 73 94 92 System.out.println ( "\n\npostorder traversal" ); tree.postorertraversal(); // perform postorder traversal of tree System.out.println(); // end main // end class TreeTest