Tree traversal. Bomen zijn overal. Ferd van Odenhoven. 15 november 2011



Vergelijkbare documenten
Tree traversal. Ferd van Odenhoven. 15 november Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering. Doorlopen van bomen

Elementary Data Structures 3

Java Programma structuur

Datastructuren; (Zoek)bomen

Doorzoeken van grafen. Algoritmiek

Datastructuren en algoritmen voor CKI

definities recursieve datastructuren college 13 plaatjes soorten Graph = ( V, E ) V vertices, nodes, objecten, knopen, punten

Hoofdstuk 2. Week 4: Datastructuren. 2.1 Leesopdracht. 2.2 Bomen. 2.3 Definitie

Algoritmiek. 15 februari Grafen en bomen

Datastructuren: stapels, rijen en binaire bomen

Tweede college algoritmiek. 12 februari Grafen en bomen

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber

Grafen en netwerken I Datastructuren en doorzoeken. Algoritmiek

Vierde college algoritmiek. 2 maart Toestand-actie-ruimte Exhaustive Search

Bomen. 8.8 ongerichte bomen 9.4 gerichte bomen ch 10. binaire bomen. deel 2. Tiende college

Vijfde college algoritmiek. 2/3 maart Exhaustive search

Lineaire data structuren. Doorlopen van een lijst

Uitwerking tentamen Algoritmiek 9 juni :00 17:00

Elfde college algoritmiek. 18 mei Algoritme van Dijkstra, Heap, Heapify & Heapsort

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

public boolean egualdates() post: returns true i f f there i f the l i s t contains at least two BirthDay objects with the same daynumber

Datastructuren en algoritmen voor CKI

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

Tentamen in2705 Software Engineering

Opgaven Zoekbomen Datastructuren, 20 juni 2018, Werkgroep.

Datastructuren: stapels, rijen en binaire bomen

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

4EE11 Project Programmeren voor W. College 3, , Blok D Tom Verhoeff, Software Engineering & Technology, TU/e

Algoritmen, Datastructuren en Complexiteit ( en ) Uitwerkingen

Bomen. 8.8 ongerichte bomen 9.4 gerichte bomen ch 10. binaire bomen. deel 1. Negende college

Opgaven Zoekbomen Datastructuren, 15 juni 2016, Werkgroep.

Datastructuren en Algoritmen voor CKI

ALGORITMIEK: antwoorden werkcollege 5

5.4.2 a. Neen: dit lukt alléén met 1, 3, 7 enzovoort. b. Ja: dit lukt met elk aantal knopen! Bijvoorbeeld de volgende boom: 1

Hoofdstuk 6. Geordende binaire bomen

Een eenvoudig algoritme om permutaties te genereren

Bomen. 8.8 ongerichte bomen 9.4 gerichte bomen ch 10. binaire bomen

Twaalfde college algoritmiek. 13 mei Branch & Bound Heap, Heapsort & Heapify

EE1400: Programmeren in C BSc. EE, 1e jaar, , 4e college

Hoofdstuk 3. Week 5: Sorteren. 3.1 Inleiding

Computationale Intelligentie Dirk Thierens

Een gelinkte lijst in C#

software constructie recursieve datastructuren college 15 5 stappen plan ontwerpen de software bestaat uiteindelijk uit datatypen functies

is eigenlijk overbodig!

Achtste college algoritmiek. 12 april Verdeel en Heers. Dynamisch Programmeren

Grafen en BFS. Mark Lekkerkerker. 24 februari 2014

Vijfde college algoritmiek. 17 maart Exhaustive search Graafwandelingen Backtracking

29 november 2012 Hashing. Een tijd-ruimte afweging Hashfuncties

DATASTRUCTUREN VOOR GESORTEERDE DATA

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Tentamen Programmeren in C (EE1400)

Datastructuren en Algoritmen

Hogeschool voor Techniek en Logistiek

Modelleren en Programmeren

Verslag Opdracht 4: Magische Vierkanten

Vierde college complexiteit. 14 februari Beslissingsbomen

Combinatorische Algoritmen: Binary Decision Diagrams, Deel III

Discrete Structuren. Piter Dykstra Sietse Achterop Opleidingsinstituut Informatica en Cognitie

Amorized Analysis en Union-Find Algoritmiek

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

SPOJ oplossingen Gilles Callebaut 7 augustus 2015

De volgende opgave gaat over de B-bomen van het college, waar sleutels zowel in de bladeren als ook in de interne knopen opgeslagen worden.

Algoritmen, Datastructuren en Complexiteit (214020/5)

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie

Minimum Opspannende Bomen. Algoritmiek

Kosten. Computationale Intelligentie. Een zoekprobleem met stapkosten. Een voorbeeld: het vinden van een route. Zoeken met kosten.

Overerving & Polymorfisme

Datastructuren Uitwerking jan

Recapitulatie: Ongeïnformeerd zoeken. Zoekalgoritmen ( ) College 2: Ongeïnformeerd zoeken. Dynamische breadth-first search

li d a l n s V a l GEMEENTE MAARTENSDIJK r Nbo bestemmingsplan buitengebied g g Nbo Nbo Schaal 1:5000 plankaart noord

Over binaire beslissingsdiagrammen naar Donald E. Knuth s The Art of Computer Programming, Volume 4

Programmeren in Java les 3

Semaforen. Semaforen p. 1/2

DATASTRUCTUREN VOOR GESORTEERDE DATA

Addendum bij hoofdstuk 5 Generieke implementatie van de zoekalgoritmen

Stacks and queues. Introductie 45. Leerkern 45. Terugkoppeling 49. Uitwerking van de opgaven 49

Tentamen Programmeren in C (EE1400)

Datastructuren college 10

Algoritmen, Datastructuren en Complexiteit (214020/5)

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

NAAM: Programmeren 1 Examen 29/08/2012

Grafen. Indien de uitgraad van ieder punt 1 is, dan bevat de graaf een cykel. Indien de ingraad van ieder punt 1 is, dan bevat de graaf een cykel.

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 5 juni 2007, uur

Vierde college complexiteit. 26 februari Beslissingsbomen en selectie Toernooimethode Adversary argument

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Tentamen Inleiding Programmeren (IN1608WI), 2 februari 2012, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

8C080 deel BioModeling en bioinformatica

Tentamen Programmeren in C (EE1400)

Derde college complexiteit. 7 februari Zoeken

Abstracte klassen & Interfaces

Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub. Belgische Olympiades in de Informatica (duur : maximum 1u15 )

Onafhankelijke verzamelingen en Gewogen Oplossingen, door Donald E. Knuth, The Art of Computer Programming, Volume 4, Combinatorial Algorithms

Modelleren en Programmeren

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Vierde college complexiteit. 16 februari Beslissingsbomen en selectie

Javascript oefenblad 1

Elfde college algoritmiek. 10 mei Algoritme van Dijkstra, Gretige Algoritmen

Transcriptie:

15 november 2011 Tree traversal Ferd van Odenhoven Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering 15 november 2011 ODE/FHTBM Tree traversal 15 november 2011 1/22 1 ODE/FHTBM Tree traversal 15 november 2011 2/22 zijn overal We kennen meerdere voorbeelden hoe bomen gebruikt kunnen worden: ter beschrijving van eigenschappen van algoritmen om datastrukturen te gebruiken en te vervaardigen, die concrete realisaties van bomen zijn op andere plaatsen: stambomen, mappenstructuur van bestandsystemen op computers, enz. Gewortelde bomen Geordende bomen M-voudige bomen en binaire bomen ODE/FHTBM Tree traversal 15 november 2011 3/22 1

15 november 2011 Definities voor bomen Definition 5.1 Een binaire boom is een exteren knoop of een interne knoop verbonden met twee binaire bomen, die de linker respectievelijk de rechter subboom genoemd worden van die knoop. Definition 5.2 Een M-voudige boom is een exteren knoop of een interne knoop verbonden met een geordende reeks van M bomen, die ook M-voudige bomen zijn. Definition 5.3 Een woud (forest) kan ook als boom worden gezien, meer precies een geordende boom. Dat is een knoop (wortel (root) genaamd) verbonden met een reeks van disjuncte bomen. Het is een algemenere M-ary boom, omdat de knopen een willekeurig aantal kind-knopen kunnen hebben. Zie Fig 5.22. ODE/FHTBM Tree traversal 15 november 2011 4/22 Boom-eigenschappen en meer definities Property 5.4 Tussen binaire bomen en geordende wouden bestaat een 1 op 1 correspondentie. Definition 5.4 Een gewortelde boom (of ongeordende boom) is een knoop (wortel (root) geheten) naar een verzameling van gewortelde bomen. (Zo n verzameling is heet een ongeordend woud.) Definition 5.5 Een graaf is een verzameling van knopen met een verzameling van takken, die paren van knopen verbinden, zo dat elk knopenpaar met tenhoogste een tak is verbonden). Meerdere voorwaarden gelden voor de defintie van een boom; bijv. Een boom is een verbonden graaf met N-1 takken. Een andere voorwaarde luidt: een boom is een graaf, waarin elk paar van knopen door precies een pad met elkaar verbonden is. ODE/FHTBM Tree traversal 15 november 2011 5/22 Binaire bomen hebben twee takken, en hun knopen kunnen daarom in drie ordeningen voorkomen: Preorder node - left - right Inorder left - node - right Postorder left - right - node node left right ODE/FHTBM Tree traversal 15 november 2011 6/22 2

15 november 2011 Programma 5.14 Pre-order doorlopen, verander de volgorde van methodeaanroepen voor een andere ordening private void traverseprer ( Node h) if (h== null ) return ; h. item. visit (); traverser (h.l); traverser (h.r); void traverse () traverseprer ( root ); ODE/FHTBM Tree traversal 15 november 2011 7/22 Voorbeeld: pre-oder markeren van liniaal static void ruler ( int l, int r, int h) int m = (l+r )/2; if (h > 0) mark (m, h); ruler (l, m, h -1); ruler (m, r, h -1); ODE/FHTBM Tree traversal 15 november 2011 8/22 Nietrecursieve loop door bomen Nietrecursieve pre-order-loop door bomen Bij de nietrecursieve variant is er een axpliciete stack. Zie programma 5.15 op een van de volgende sheets. Het programma gebruikt de stack om de volgorde bij te houden waarin de knopen bezocht worden. Bij de declaratie van de stack wordt geen maximum aangegeven; we gaan ervan uit dat we geen geheugenproblemen krijgen. Level-order doorlopen Een andere manier om een boom te doorlopen is level-order: van boven naar beneden bezoek je alle knopen per niveau (level) van links naar rechts voordat je naar het volgende niveau daaronder gaat. Merk op, dat het programma een queue in plaats van een stack gebruikt, ook nu weer zonder een maximum grootte. ODE/FHTBM Tree traversal 15 november 2011 9/22 3

15 november 2011 Programma 5.15: Nietrecursieve pre-order doorloop private void traverseprenr ( Node h) NodeStack s = new NodeStack (); s. push (h); while (!s. empty ()) h = s. pop (); h. item. visit (); if (h.r!= null ) s. push (h.r); if (h.l!= null ) s. push (h.l); ODE/FHTBM Tree traversal 15 november 2011 10/22 Programma 5.16: Level-order doorloop private void traverselevnr ( Node h) NodeQueue q = new NodeQueue (); q. put (h); while (!q. empty ()) h = q. get (); h. item. visit (); if (h.l!= null ) q. put (h.l); if (h.r!= null ) q. put (h.r); ODE/FHTBM Tree traversal 15 november 2011 11/22 Recursieve binaire boom algoritme Enkele nuttige basisberekeningen en operaties. Knopen tellen Hoogte berekenen Boom afdrukken maken ODE/FHTBM Tree traversal 15 november 2011 12/22 4

15 november 2011 Programma 5.17 private static int count ( Node h) if ( h == null ) return 0; return count (h.l) + count (h.r) +1; int count () return count ( root ); int height () return height ( root ); ODE/FHTBM Tree traversal 15 november 2011 13/22 Programma 5.17a private static int height ( Node h) if ( h == null ) return -1; int u = height (h.l), v = height (h.r); if (u>v) return u +1; else return v +1; ODE/FHTBM Tree traversal 15 november 2011 14/22 Programma 5.18 static void printnode ( Item x, int h) for ( int i =0; i<h; i ++) Out. print (" "); Out. println ("[" + x + "]"); void show () showr (root, 0); ODE/FHTBM Tree traversal 15 november 2011 15/22 5

15 november 2011 Programma 5.18a private static void showr ( Node t, int h) if (t == null ) printnoder (null, h); return ; showr (t.r, h +1); printnode (t.item, h); showr (t.l, h +1); ODE/FHTBM Tree traversal 15 november 2011 16/22 : Diepzoeken (depth first) Een boom is een graaf en een graaf KAN een boom zijn. Een belangrijke manier om knopen in een graaf te bezoeke is depth first Daarbij moet men bijhouden welke knopen bezocht zijn! Depth-first: van een wortel een kind-knoop bezoeken, daarvan weer de kindknopen bezoeken enz., voordat men andere kindnopen van de wortelknoop gaat bezoeken. Als we alle knopen die we bezoech hebben met elkaar verbinden, volgens het bezoekschema, dan vormen die verbindingen met de knopen een opspannende boom. ODE/FHTBM Tree traversal 15 november 2011 17/22 Graaf implementatie class Graph private int Vcnt, Ecnt ; private class Node int v; Node next ; Node ( int x, Node t) v = x; next = t; private Node adj []; Graph ( int V) Vcnt = V; Ecnt = 0; adj = new Node [V]; void insert ( Edge e) int v = e.v, w = e.w; adj [v] = new Node (w, adj [v ]); if (! digraph ) adj [w] = new Node (v, adj [w ]); Ecnt ++; ODE/FHTBM Tree traversal 15 november 2011 18/22 6

15 november 2011 Graaf: adjacentie matrix representatie 0 1 2 3 4 5 6 7 0 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 2 1 0 1 0 0 0 0 1 3 0 0 1 1 1 0 0 0 4 0 0 0 1 1 1 1 0 5 1 0 0 1 1 1 0 0 6 1 0 0 0 1 0 1 0 7 1 1 1 0 1 0 0 1 Figuur: 3.16 (Sedgewick: pagina 121) In plaats van een matrix kunnen we ook een array van het type Node nemen. Node[] adj = new Node[V]. Deze knopen moeten weten of ze al bezocht zijn. boolean[] visited = new boolean[v]. ODE/FHTBM Tree traversal 15 november 2011 19/22 Programma 5.21 (Sedgewick: pagina 522) private void dfs ( int k) visit (k); visited [k] = true ; for ( Node t = adj [k]; t!= null ; t=t. next ) if (! visited [t.v]) dfs (t.v); Als de graaf een boom is, is een recursieve depth first search beginnend bij de root gelijk aan het preorder doorlopen van de boom. Zie Sedgewick figuren 5.33 und 5.34 voor de details van het voorbeeld met de adjacentie matrix zoal hiervoor werd gegeven. ODE/FHTBM Tree traversal 15 november 2011 20/22 : Breedzoeken (breadth first) Een boom is een graaf en een graaf KAN een boom zijn. Een volgende belangrijke wijze waarop men knopen kan bezoeken is Breedtezoeken (breadth first) Breedtezoeken: vanuit de wortel eerst alle kindknopen bezoeken en daarna pas de kinderen van een kin. Ook daarbij moet mem bijhouden welke knopen al bezocht werden! Als we alle knopen die we bezocht hebben met elkaar verbinden, volgens het bezoekschema, dan vormen die verbindingen met de knopen een opspannende boom. ODE/FHTBM Tree traversal 15 november 2011 21/22 7

15 november 2011 Programma 5.22 void bfs ( int k) intqueue q = new intqueue (V*V); q. put (k); while (!q. empty ()) if (! visited [k = q. get ()]) Node t; visit (k); visited [k] = true ; for (t = adj [k]; t!= null ; t=t. next ) if (! visited [t.v]) q. put (t.v); Vergelijk dit programma met het programma voor de level-order tree-traversal. ODE/FHTBM Tree traversal 15 november 2011 22/22 8