Föreläsning 13. Träd

Relevanta dokument
Föreläsning 14. Träd och filhantering

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Föreläsning 9 Innehåll

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Föreläsning 7. Träd och binära sökträd

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningar Datastrukturer TDA

Föreläsning 11. ADT:er och datastrukturer

Föreläsning 15: Repetition DVGA02

Träd - C&P kap. 10 speciellt binära sökträd sid. 452

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

Träd Hierarkiska strukturer

Träd. Rot. Förgrening. Löv

Föreläsning 14. Filhantering

729G04: Inlämningsuppgift Diskret matematik

Ett generellt träd är. Antingen det tomma trädet, eller en rekursiv struktur: rot /. \ /... \ t1... tn

Föreläsning 3. Stack

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning Datastrukturer (DAT036)

Föreläsning 3. Stack

Algoritmer och datastrukturer 2012, föreläsning 6

Tentamen i Algoritmer & Datastrukturer i Java

Algoritmer och datastrukturer 2012, fo rela sning 8

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Föreläsning 9 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Träd. Ett träd kan se ut på detta sätt:

Ännu mera träd: 2-3-träd, B-träd, rödsvarta träd, träd Weiss, avsnitt 4.7, 11.5, 12.2, etc.

Upplägg. Binära träd. Träd. Binära träd. Binära träd. Antal löv på ett träd. Binära träd (9) Binära sökträd (10.1)

Föreläsning Datastrukturer (DAT036)

Föreläsning 9 Innehåll

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

Tentamen Datastrukturer, DAT037 (DAT036)

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Trädstrukturer och grafer

Tentamen i Algoritmer & Datastrukturer i Java

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

Föreläsning 4 Datastrukturer (DAT037)

Datastrukturer. Föreläsning 5. Maps 1

Föreläsning Datastrukturer (DAT036)

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Tentamen, Algoritmer och datastrukturer

Informationsteknologi Tom Smedsaas 19 augusti 2016

Självbalanserande AVL-träd Weiss, avsnitt 4.4

Föreläsning 10 Datastrukturer (DAT037)

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Tentamen Datastrukturer för D2 DAT 035

Länkade strukturer, parametriserade typer och undantag

DAI2 (TIDAL) + I2 (TKIEK)

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Tillämpad Programmering (ID1218) :00-13:00

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Sätt att skriva ut binärträd

Vad har vi pratat om i kursen?

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

Tentamen Datastrukturer D DAT 035/INN960

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

Tentamen i. TDDC67 Funktionell programmering och Lisp

Datastrukturer. föreläsning 10. Maps 1

Föreläsning Datastrukturer (DAT037)

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Implementering av tabellen. Operationer på tabellen

Föreläsning 10. ADT:er och datastrukturer

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen Datastrukturer (DAT036)

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

TDDC Terminologi Uppdaterad Fö #1

Tentamen Datastrukturer, DAT037 (DAT036)

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Föreläsning 4 Datastrukturer (DAT037)

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 8 Om abstrakta datatyper och binära sökträd

Seminarium 13 Innehåll

Föreläsning Datastrukturer (DAT036)

Dugga Datastrukturer (DAT036)

Föreläsning 3 Datastrukturer (DAT037)

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Specifikationer för tabellfunktionerna. Operationer på tabellen

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

Föreläsning 7. Träd och binära sökträd

Binära sökträd. Seminarium 9 Binära sökträd Innehåll. Traversering av binära sökträd. Binära sökträd Definition. Exempel på vad du ska kunna

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Datastrukturer och algoritmer

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Föreläsning 5 Datastrukturer (DAT037)

Övning 2. (Länkade) Listor, noder

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Algoritmer, datastrukturer och komplexitet

Teoretisk del. Facit Tentamen TDDC (6)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Transkript:

Föreläsning 13 Träd

Träd Ett träd är en datastruktur som tillåter oss att modellera sådant som vi inte kan modellera med linjära datastrukturer. Ett datavetenskapligt träd består av noder med pilar emellan. Ett datavetenskapligt träd ritas upp och ner med roten överst. Ett träd representerar både en samling noder och någon form av relation mellan dem. 2

Matematisk definition av träd Ett träd är en ändlig mängd T av en eller flera noder (förbundna med riktade kanter) sådan att: - Exakt en av noderna i T har ingen föregångare. Denna kallas rot. - Resterande noder kan delas in i disjunkta mängder T1, T2,..., Tm. - Var och en av mängderna Ti är också träd. Dessa mängder Ti kallas subträd till T. (Ett subträd är kopplat till roten via en riktad kant från roten till subträdets rot.) 3

Exempel på träd: arvshierarkier Alla Javas klasser är delar av ett enda träd med Object-klassen som rot. Klasserna i Wheels är del av Javas arvshierarki. Ju närmre roten en klass ligger desto mer generell blir den. AbstractGraphic Shape RectangularShape Line Ellipse Rectangle RoundedRectangle ConversationBubble 4

Exempel på träd: komponenthierarkier Komponenthierarkier kan också modelleras som träd. Ju närmre roten desto fler komponenter. DrawingPanel JFrame JPanel ButtonPanel JRadioButton JRadioButton JRadioButton 5

Trädterminologi Rotnod: Noden utan föregångare (A i figuren). Riktad kant (edge): Pil som förbinder en nod med en annan. Föräldra-, barnnod: En nods föregångare kallas föräldranod. En nods efterföljare kallas barnnoder. Lövnod: En nod utan barn. Noddjup: Antalet kanter man måste följa för att komma från roten till noden. B A C D E F G I H Höjden på trädet: Det största noddjupet. Nodgrad: Antalet barn en nod har. 6

Binära träd och binära sökträd Binärt träd: Träd vars noder alla har grad 0, 1 eller 2 (maximalt två barn/nod). Binärt sökträd: Binärt träd för vilket gäller för alla noder att datat i vänster subträd är mindre än datat i noden och datat i höger subträd är större än det i noden. C B G A E H D F A B C D E F G H 7

Jämförelse av datastrukturer Vilken datastruktur är bäst då vi vill lagra orden i en ordlista eller personer i en telefonkatalog? Array... + sökning - sätta in, ta bort Länkad lista Binärt sökträd... + sätta in, ta bort - sökning + sökning, sätta in, ta bort... 8

Genomgång av elementen i ett träd Hur går man igenom dataelementen i ett träd på ett systematiskt sätt? Dataelementen i en linjär struktur går man vanligtvis igenom i ordning från början till slutet. Men hur gör man i ett träd? Med ett träd finns flera möjligheter. Tre av de mest kända för binära träd bygger på att man går igenom trädet genom att följa den röda pilen i figuren. START På detta sätt kommer alla noder med i C genomgången. Noderna besöks olika B F antal gånger (1, 2 eller 3 gånger) beroende på A E H hur många barn de har. D G 9

Genomgång av elementen i ett träd När ska man titta på värdet i noden? Ska man titta på det första gången man kommer till noden och sedan titta på noderna i vänsterträdet och sedan i högerträdet? (Pre-order: CBAFEDHG) Eller ska man titta på värdet i noden efter det att man tittat på vänsterträdets noder? (In-order: ABCDEFGH) Eller, som tredje alternativ, ska man titta på värdet i noden efter det att man tittat i vänsterträdets och högerträdets noder? (Post-order: ABDEGHFC) B C START F A E H D G 10

Praktiska tillämpningar Det finns praktiska tillämpningar för de olika sätten att gå igenom noderna i ett binärt träd. Exempelvis kan vi skriva upp aritmetiska uttryck (som 2 * 3) med hjälp av binära träd, där siffrorna blir lövnoder. Om vi går igenom trädet i in-order får vi den normala infix-versionen av det aritmetiska uttrycket: 2 * 3 Om vi går igenom trädet i pre-order får vi prefixversionen av det aritmetiska uttrycket: * 2 3 Om vi går igenom trädet i postorder får vi postfix-versionen av det aritmetiska uttrycket: 2 3 * * Sammanfattningsvis: infix: 2 * 3 2 3 prefix: * 2 3 postfix: 2 3 * 11

Praktiska tillämpningar Infix-notation: Den vanligste notationen för aritmetiska uttryck och den som är mest vanlig i miniräknare. Postfix-notation: Används i vissa miniräknare. Man säger även att dessa räknare använder sig av Reverse Polish Notation (RPN) efter den polske logikern Lukasiewicz som visade fördelarna med postfix framför infix (inga parenteser behövs i de aritmetiska uttrycken). Prefix-notation: I programspråket Lisp används prefix-notaionen för aritmetiska uttryck. Fördelen med detta skrivsätt blir att de aritmetiska operatorerna, som + och *, får samma syntax som alla andra funktioner. 12

Praktiska tillämpningar Infix: (2 + 3) * (5-1) Prefix: * + 2 3-5 1 Postfix: 2 3 + 5 1 - * Kommentarer: - Med infix-notationen krävs ibland parenteser för att få rätt tolkning. - I Lisp blir prefix-uttrycket: (* (+ 2 3) (- 5 1)) START * + - 2 3 5 1 13

Praktiska tillämpningar START - + * * / 5 + 5 2 3 4 7 8 Infix: 5 * 2 + 3 / 4 5 * (7 + 8) Prefix: - + * 5 2 / 3 4 * 5 + 7 8 Postfix: 5 2 * 3 4 / + 5 7 8 + * - 14

Praktiska tillämpningar Att utvärdera ett aritmetiskt uttryck i postfix-notation kan enkelt göras med hjälp av en stack. Man går igenom uttrycket från vänster till höger en gång. När man stöter på ett tal lägger man det på stacken, när man stöter på en operator poppar man stacken två gånger, utför beräkningen med de givna talen och operatorn samt lägger resultatet på stacken. Exempel: Utvärdera uttrycket 5 2 * 3 4 / + 5 7 8 + * - 5 2 5 10 10 3 4 3 0 5 10 10 10 10 8 10 57 10 57 15 5 10 75 10-65 15

Java-kod för utvärdering av postfix-uttryck //Pre: Strängen seq är ett aritmetiskt uttryck (med heltal // och operationerna +,, * och /) i postfix. //Post: resultat = det aritmetiska uttrycket utvärderat. public int postfix(string [] seq) { Stack<Integer> stack = new Stack<Integer>(); } for (int i = 0; i < seq.length; i++) { try { int tal = Integer.parseInt(seq[i]); stack.push(new Integer(tal)); } catch (NumberFormatException e) { int tal2 = stack.pop().intvalue(); int tal1 = stack.pop().intvalue(); int res = 0; if (seq[i].equals( + )) res = tal1 + tal2; else if (seq[i].equals( )) res = tal1 tal2; else if (seg[i].equals( * )) res = tal1 * tal2; else if (seq[i].equals( / )) res = tal1 / tal2; stack.push(new Integer(res)); } } return stack.pop(); 16

Insättning i ett binärt sökträd Antag att vi vill sätta in talen 7, 10, 1, 0, -3, 45, 15, 8 i den ordning de anges i ett binärt sökträd. Hur går vi då till väga? Börja med ett tomt träd och lägg 7 i rotnoden. Tag sedan 10 och då 10 > 7 sätts 10 in som högerbarnnod till 7. Fortsätt på samma sätt med resten av talen. Vad händer om talen i talföljden byter ordning? 7 START 1 10 0 8 45-3 15 Preorder: 7, 1, 0, -3, 10, 8, 45, 15 Inorder: -3, 0, 1, 7, 8, 10, 15, 45 Postorder: -3, 0, 1, 8, 15, 45, 10, 7 17

Binärt träd Antag att vi har ett binärt träd och att det skrivs ut på följande sätt: - inorder: 2, 1, 3, 9, 7, 4, 5, 0, 8 - preorder: 7, 1, 2, 3, 9, 5, 4, 8, 0 Hur ser trädet ut? (Obs! Trädet är inget binärt sökträd.) START 2 1 3 9 7 4 5 0 8 7 1 2 3 9 5 4 8 0 7 1 5 2 3 4 8 9 0 18

ADT:n Binärt sökträd Exempel på egenskaper: - Kan innehålla ett obegränsat antal element. Exempel på operationer: Beskrivning: Skapar ett tomt träd. Pre: sant Post: ett nytt tomt träd har skapats BST() Beskrivning: Kollar om ett element finns i trädet. Pre: sant Post: resultat = sant om elementet i trädet, annars falskt search(in: element, ut: boolskt värde) Beskrivning: Lägger till ett element i trädet. Pre:!search(element) Post: element är insatt i trädet insert(in: element) Beskrivning: Tar bort ett element ur trädet. Pre: search(element) Post: element borttaget ur trädet delete(in: element) Beskrivning: Kollar om trädet är tomt. Pre: sant Post: resultat = sant om trädet är tomt, annars falskt isempty(ut: boolskt värde) Beskrivning: Skriver ut trädet i preorder Pre: sant Post: resultat = sträng med trädet i preorder preorder(ut: sträng) 19

Insättning i binärt sökträd Exempel: Sätt in 5 i följande binära sökträd: 3 Pseudokod för insättning: 1 7 2 START 5 8 insertaux(siffra, rotnod) om rotnod är tom skapa en ny nod och lägg siffra i den sätt rotnod lika med den nya noden annars om siffra < siffran i rotnod vänsterbarn till rotnod = insertaux(siffra, vänsterbarn till rotnod) annars om siffra > siffran i rotnod högerbarn till rotnod = insertaux(siffra, högerbarn till rotnod) skicka tillbaka rotnod 20

Sökning i binärt sökträd Exempel: Sök 5 i följande binära sökträd: 3 Pseudokod för sökning: 1 7 2 START 5 8 searchaux(siffra, rotnod) om rotnod är tom skicka tillbaka falskt annars om siffra < siffran i rotnod skicka tillbaka searchaux(siffra, vänsterbarn till rotnod) annars om siffra > siffran i rotnod skicka tillbaka searchaux(siffra, högerbarn till rotnod) annars skicka tillbaka sant 21

Syftet med lab 6 är att: ge övning i att skriva rekursiva metoder, ge övning i att implementera datastrukturen träd, träna filhantering och träna hantering av undantag. Laborationen går ut på att komplettera ett befintligt program med vissa metoder. 22

Del av klassdiagrammet till lab 6 I klassen BST finns en egenskap, rotnoden. Observera att metoderna i de allra flesta fall är dubblerade: en metod har ett enkelt gränssnitt och den andra är rekursiv i varje par. _element _left _right En nod har tre egenskaper och förmågorna består av en konstruktor och set- och getmetoder. 23