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

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

Föreläsning 9 Innehåll

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

Föreläsning 9 Innehåll

Algoritmer och datastrukturer 2012, föreläsning 6

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

Tentamen, Algoritmer och datastrukturer

Föreläsning 13. Träd

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

Föreläsning 14 Innehåll

Träd Hierarkiska strukturer

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

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

Föreläsning 10 Innehåll

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

Föreläsning 11 Innehåll. Diskutera. Binära sökträd Definition. Inordertraversering av 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

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

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

Föreläsning 9 Datastrukturer (DAT037)

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

Datastrukturer som passar för sökning. Föreläsning 10 Innehåll. Inordertraversering av binära sökträd. Binära sökträd Definition

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Datastrukturer som passar för sökning. Föreläsning 11 Innehåll. Binära sökträd Definition. Inordertraversering av binära sökträd

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

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

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Föreläsning Datastrukturer (DAT036)

Datastrukturer. Föreläsning 5. Maps 1

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

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

DAI2 (TIDAL) + I2 (TKIEK)

Föreläsning 4 Innehåll

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

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

Tildatenta Lösningsskiss

Trädstrukturer och grafer

Föreläsning 3 Datastrukturer (DAT037)

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å

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

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Datastrukturer. föreläsning 10. Maps 1

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)

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

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 2. Länkad lista och iterator

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

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

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 6. Rekursion och backtracking

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Föreläsning 10 Datastrukturer (DAT037)

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Tentamen Datastrukturer (DAT036)

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

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

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

13 Prioritetsköer, heapar

Föreläsning 3 Datastrukturer (DAT037)

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen i Algoritmer & Datastrukturer i Java

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 2. Länkad lista och iterator

Länkade strukturer, parametriserade typer och undantag

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

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

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

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

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Fredag 10 juni 2016 kl 8 12

Seminarium 13 Innehåll

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

Föreläsning 1 Datastrukturer (DAT037)

Tentamen (del 2) (4 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Tentamen TEN1 HI

Föreläsning 5 Datastrukturer (DAT037)

Sätt att skriva ut binärträd

Diskutera. Hashfunktion

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.

F4: Mer om OU1, OU2, listor och träd. Carl Nettelblad

Lösningar Datastrukturer TDA

Exempeltenta GruDat 2002/2003

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

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

KTH, NADA, Vahid Mosavat. 1. Flervalsfrågor (5p)

Tentamen Datastrukturer, DAT037 (DAT036)

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.

Introduktionsmöte Innehåll

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

Algoritmer och datastrukturer

Programmering fortsättningskurs

Lösningsförslag till exempeltenta 1

Vad har vi pratat om i kursen?

Transkript:

Föreläsning 8 Innehåll Datastrukturer i kursen Träd, speciellt binära träd egenskaper användningsområden implementering Undervisningsmoment: föreläsning 8, övningsuppgifter 8, lab 4 Avsnitt i läroboken: 6. 6.3 I gamla upplagan: 8. 8.3 Hittills har vi använt datastrukturerna vektor och enkellänkad lista. T.ex. för att implementera de abstrakta datatyperna lista, stack och kö. I kursen används också träd binära sökträd och hashtabeller för att implementera de abstrakta datatyperna mängd (eng. Set) och lexikon (eng. Map). heapar för att implementera den abstrakta datatypen prioritetskö. PFK (Föreläsning 8) HT 06 / 30 PFK (Föreläsning 8) HT 06 / 30 Träd Träd rekursiv definition Icke-linjär struktur En nod i ett träd kan ha högst en föregångare (förälder), men flera efterföljare (barn). Ett träd är antingen tomt (har inga noder) eller består av en speciell nod, roten, och noll eller flera subträd. rot tre subträd Jfr. listor som är linjära strukturer En nod i en lista kan ha högst en föregångare och en efterföljare. PFK (Föreläsning 8) HT 06 3 / 30 PFK (Föreläsning 8) HT 06 4 / 30

Släkträd Exempel på användning av träd Terminologi lånad från släktträd Karl XIV Johan 763-844 Antag att två noder n och n är förbundna med en båge och n är den övre av dem n är då förälder till n och n är barn till n Oskar I 799-876 Noder som har samma förälder kallas syskon (eng: siblings) Karl XV 86-87 Gustaf 87-85 Oskar II 89-907 Eugenie 830-889 August 83-873 Antag att två noder n och n är förbundna med en serie bågar och n är den övre av dem n är då förfader (eng: ancestor) till n n är avkomling (eng: descendant) till n PFK (Föreläsning 8) HT 06 5 / 30 PFK (Föreläsning 8) HT 06 6 / 30 Terminologi lånad från naturen Begreppen nivå eller djup för en nod Rot den enda nod som saknar förälder I datavetenskap ritas träden upp och ned med roten överst. Löv noder som saknar barn Gren enserienoderförbundnamedvarandra rot Rotens nivå (djup) är. En nod som inte är rot har nivå (djup) =föräldernsnivå(djup)+. nivå = djup = nivå = djup = löv En gren i trädet visas med: nivå = djup = 3 löv löv löv PFK (Föreläsning 8) HT 06 7 / 30 PFK (Föreläsning 8) HT 06 8 / 30

Begreppet höjd för ett träd Binära träd Ett tomt träd har höjden 0. Ett träd som inte är tomt har höjd =maximalanivån(djupet)för noderna i trädet. Ett träd är binärt om varje nod har högst två barn (eller ekvivalent, två subträd). Ett träd är strikt binärt om varje nod har noll eller två barn. D.v.s. alla noder som inte är löv har två barn. trädets höjd = 3 nivå = djup = 3 Ej binärt, roten har tre barn Binärt, men ej strikt binärt Strikt binärt PFK (Föreläsning 8) HT 06 9 / 30 PFK (Föreläsning 8) HT 06 0 / 30 Binära träd speciell terminologi För ett binärt träd brukar man tala om vänster respektive höger subträd till en nod vänster respektive höger barn till en nod Aritmetiska uttryck Exempel på användning av (strikt) binära träd Ett aritmetiskt uttryck med (de binära) operationerna +,, * och / kan representeras av ett (strikt) binärt träd: + * * + 3 Vänster barn till roten Höger barn till roten 3 Vänster subträd till roten OBS: en nod kan ha höger barn utan att ha vänster barn. Höger subträd till roten + * 3 ( + ) * 3 Operander lagras i löv, operatorer i övriga noder. Ett träds värde = operatorn i roten applicerad på värdet av subträden. Ett lövs värde är det värde som lagrats i lövet. PFK (Föreläsning 8) HT 06 / 30 PFK (Föreläsning 8) HT 06 / 30

Huffmanträd Exempel på användning av (strikt) binära träd Binära sökträd Exempel på användning av binära träd Mona I Huffmankodning byts tecken ut mot koder av olika längd. Vanligt förekommande tecken ska ha kortare kod än mer sällsynta tecken. Hans Nora Tecken Kod a 0 b 00 c 0 d a 0 PFK (Föreläsning 8) HT 06 3 / 30 Implementering av binära träd Klassen BinaryTree b 0 0 c d Anna Karl Lagrar element med söknyckel för vilken jämförelseoperationer är definierade. Här: sträng. Nycklarna i vänster subträd är mindre än rotens nyckel som i sin tur är mindre än nycklarna i höger subträd. Fördel: Enkelt och snabbt att leta upp, sätta in och ta bort element. PFK (Föreläsning 8) HT 06 4 / 30 Implementering av binära träd Klassen Node Tora public class BinaryTree<E> { private Node<E> root; public BinaryTree() { root = ;... operationer på trädet... private static class Node<E> { // se nästa bild root private static class Node<E> { private E data; private Node<E> left; private Node<E> right; private Node(E data) { this.data = data; left = right = ;... data left right PFK (Föreläsning 8) HT 06 5 / 30 PFK (Föreläsning 8) HT 06 6 / 30

Rekursiva traverseringar av binära träd Diskutera Traversering betyder att vi besöker varje nod i trädet. M Många operationer på träd kan tolkas som traversering. Under traverseringen utför man operationer på noderna. H S Man kan traversera träd i olika ordningar, t ex följande rekursivt definierade: preorder: först roten, sedan vänster subträd i preorder, därefter höger subträd i preorder inorder: först vänster subträd i inorder, sedan roten och därefter höger subträd i inorder postorder: först vänster subträd i postorder, sedan höger subträd i postorder och därefter roten A K N T Ivilkenordningbehandlasnodernaommantraverserarträdeti preorder? inorder? postorder? PFK (Föreläsning 8) HT 06 7 / 30 PFK (Föreläsning 8) HT 06 8 / 30 Algoritm för preordertraversering Diskutera if trädet tomt return else besök roten traversera vänster subträd traversera höger subträd Exempel: Skriv ut innehållet i alla noder i preorder i det träd där n är rot. private void print(node<e> n) { if (n!= ) { System.out.println(n.data); print(n.left); print(n.right); private void print(node<e> n) { if (n!= ) { System.out.println(n.data); print(n.left); print(n.right); Hur ska metoden print ändras för att noderna ska skrivas ut i inorder respektive postorder? PFK (Föreläsning 8) HT 06 9 / 30 PFK (Föreläsning 8) HT 06 0 / 30

Traversera trädet rekursivt alternativ Publik metod i trädklassen Traversera trädet rekursivt alternativ Rekursiv metod i nodklassen Alternativt kan vi placera den rekursiva metoden i nodklassen. I klassen BinaryTree implementerar vi då endast följande publika metod: /** Skriver ut trädet i preorder */ public void print() { if (root!= ) { root.print(); Metoden print i klassen Node<E> finns på nästa bild. /* Skriver ut det träd där noden är rot i preorder. */ private void print() { System.out.println(data); if (left!= ) { left.print(); if (right!= ) { right.print(); PFK (Föreläsning 8) HT 06 / 30 PFK (Föreläsning 8) HT 06 / 30 Exempel: visualisera träd Visualisera innehåll och form på ett träd genom att översätta trädet till en sträng enligt: b d a e c a b d c e Strängen beskriver trädet i preorder Barn indenteras blanksteg i förhållande till föräldern Varje nod på ny rad Tomma subträd representeras av delsträngen PFK (Föreläsning 8) HT 06 3 / 30 Visualisera träd implementering Enklare problem sträng med trädets innehåll public String tostring() { StringBuilder sb = new StringBuilder(); buildstring(root, sb); return sb.tostring(); private void buildstring(node<e> n, StringBuilder sb) { if (n!= ) { sb.append(n.data); sb.append( \n ); buildstring(n.left, sb); buildstring(n.right, sb); Observera att man skapar ett enda StringBuilder-objekt. Det måste skickas med som parameter till den rekursiva metoden. PFK (Föreläsning 8) HT 06 4 / 30

Visualisera träd implementering public String tostring() { StringBuilder sb = new StringBuilder(); buildstring(root, 0, sb); return sb.tostring(); private void buildstring(node<e> n, int indent, StringBuilder sb) { for (int i = 0; i < indent; i++) { sb.append( ); if (n == ) { sb.append("\n"); else { sb.append(n.data); sb.append( \n ); buildstring(n.left, indent +, sb); buildstring(n.right, indent +, sb); PFK (Föreläsning 8) HT 06 5 / 30 Traversering i inorder Exempel Traversering i postorder Exempel Om vi har ett binärt träd som representerar aritmetiska uttryck kan vi beräkna trädets värde som en postorder-genomgång. Subträdens värden beräknas först. Därefter besöks roten genom att dess operator appliceras på subträdens värde. + + * 3 * 3 + * ( + ) * 3 PFK (Föreläsning 8) HT 06 6 / 30 Nivå- för nivåtraversering 3 Om vi har ett binärt sökträd får vi elementen i stigande ordning vid en inorder-genomgång. Anna Hans Karl Mona Nora Tora Nivå- för nivåtraversering kan implementeras med hjälp av en kö: skapa en tom kö lägg in roten i kön så länge kön inte är tom tag ut och behandla första noden (actnode) om actnode.left!= lägg in actnode.left i kön om actnode.right!= lägg in actnode.right i kön PFK (Föreläsning 8) HT 06 7 / 30 PFK (Föreläsning 8) HT 06 8 / 30

Träd, binära träd, binära sökträd Datorlaboration 4 Binära sökträd Implementera en egen generisk klass för binära sökträd. Exempel på vad du ska kunna Förklara begreppen träd och binära träd samt begrepp som rot, löv, subträd, förälder, barn. Förklara begreppen nivå/djup för en nod och begreppet höjd för träd. Implementera träd med en länkad datastruktur. Beskriva olika sätt att traversera träd: preorder, inorder, postorder. Implementera operationer på träd, speciellt rekursiva metoder. 4 5 6 9 8 Tips: I flera fall blir det en (kort) publik metod som anropar en privat rekursiv metod. I en av metoderna ska ett nytt träd byggas upp från värden i en vektor. Hämta inspiration från den rekursiva algoritmen för binärsökning. Rita för att förstå vad som händer i programmet! Innehåll: binära sökträd, rekursion, länkad struktur. PFK (Föreläsning 8) HT 06 9 / 30 PFK (Föreläsning 8) HT 06 30 / 30