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

Relevanta dokument
Träd, speciellt binära sökträd. Träd allmänt

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

Föreläsning 9 Innehåll

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

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

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

Träd Hierarkiska strukturer

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

Föreläsning Datastrukturer (DAT036)

Algoritmer och datastrukturer 2012, föreläsning 6

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 13. Träd

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 9 Innehåll

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

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

Föreläsning 4 Datastrukturer (DAT037)

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

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

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

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

Föreläsning 10 Innehåll

Föreläsning 10 Datastrukturer (DAT037)

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

Föreläsning Datastrukturer (DAT036)

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

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

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

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

Trädstrukturer och grafer

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

13 Prioritetsköer, heapar

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.

Tentamen, Algoritmer och datastrukturer

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

Algoritmer och datastrukturer

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

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

Tentamen TEN1 HI

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

Datastrukturer. Föreläsning 5. Maps 1

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

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.

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

Lösningar Datastrukturer TDA

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

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Självbalanserande träd AVL-träd. Koffman & Wolfgang kapitel 9, avsnitt 1 2

Föreläsning 3 Datastrukturer (DAT037)

BST implementering, huvudstruktur

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

TDIU01 Programmering i C++

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

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Föreläsning 5 Datastrukturer (DAT037)

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

Lösningsförslag till exempeltenta 1

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

Föreläsning 5 TDDC91,TDDE22,725G97: DALG. Föreläsning i Datastrukturer och algoritmer 18 september 2018

Länkade strukturer, parametriserade typer och undantag

DAI2 (TIDAL) + I2 (TKIEK)

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

Tentamen Datastrukturer (DAT036)

Grafik, grafiska användargränssnitt och rörliga bilder

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

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

Datastrukturer. föreläsning 10. Maps 1

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Föreläsning 14. Filhantering

Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Seminarium 13 Innehåll

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Föreläsning Datastrukturer (DAT036)

Programmering för språkteknologer II, HT2014. Rum

Lösningsförslag till tentamen

Algoritmer och datastrukturer 2012, fo rela sning 8

Tentamen Datastrukturer, DAT037 (DAT036)

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)

Tentamen i Algoritmer & Datastrukturer i Java

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

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)

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Tildatenta Lösningsskiss

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

Lösningsförslag till tentamen

Tentamen Datastrukturer, DAT037 (DAT036)

Datastrukturer. föreläsning 3. Stacks 1

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Tommy Färnqvist, IDA, Linköpings universitet

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

Transkript:

Föreläsning 10 Träd - C&P kap. 10 speciellt binära sökträd sid. 452 Dessa bilder finns i PDF-format på http://dsv.su.se/courses/pm2/f10/index.html Jozef Swiatycki DSV Bild 1

förälder Träd allmänt Binär-länkad (icke-linjär), hierarkisk struktur. Består av noder förbundna med kanter. Varje nod har exakt en förälder utom roten som har ingen. Noder utan barn kallas löv. ancestor (förfader) descendent (ättling) barn syskon varelser rot fiskar fåglar fyrfota djur kräldjur förälder löv löv människor barn syskon tamdjur syskon vilda djur lärare studenter löv en nods nivå = antalet steg till roten trädets höjd = maximala nodnivån löv rotens nivå = 1 tomt träds höjd = 0 subträd Jozef Swiatycki DSV Bild 2

Generella träd - en möjlig implementering Varje nod har en array med referenser till sina barn (alternativt kan varje nod ha en länkad lista med referenser till barnen) rot varelse fisk fågel fyrfota djur kräldjur människa tamdjur vilddjur lärare student Jozef Swiatycki DSV Bild 3

Binära träd Maximal utgreningsgrad = 2, dvs varje nod har högst 2 barn Brukar kallas vänster- resp. högerbarn (-subträd). 17 21 14 21 19 11 15 19 23 31 31 70 70 10 10 22 Jozef Swiatycki DSV Bild 4

Binära träd Fullständigt binärt träd: alla påbörjade nivåer är helt fyllda, dvs varje löv har samma nivå och varje icke-löv har två barn 17 14 21 11 15 19 23 Komplett binärt träd: alla nivåer utom det nedersta är helt fyllda, på den nedersta nivån ligger noderna till vänster 17 14 21 11 15 19 23 45 13 77 Jozef Swiatycki DSV Bild 5

Binära träd - användningsexempel Beslutsträd Är du hungrig? Ja Nej Gillar du pasta? Ja Nej Vill du gå på bio? Ja Nej Binära sökträd noder i vänstra subträdet har värden som är mindre än eller lika med förälderns, noder i högra subträdet har större värden än föräldern < 17 14 21 < < < 11 15 23 < Heap barnens noder har värden som är lägre än eller lika med förälderns, måste vara komplett 47 15 23 15 11 21 Jozef Swiatycki DSV Bild 6

Arrayimplementering av kompletta binära träd 47 0 1 2 15 23 3 4 5 15 11 21 data antal 47 15 23 15 11 21 0 1 2 3 4 5 6 7 6 roten finns i data[0] i-te nodens vänstra barn finns i data[2*i+1] (om 2*i+1 < antal) i-te nodens högra barn finns i data[2*i+2] (om 2*i+2 < antal) i-te nodens förälder finns i data[(i-1)/2] (om i > 0) (med i-te nod menar jag noden i data[i]) Jozef Swiatycki DSV Bild 7

Länkad implementering av binära träd Exempel: binärt sökträd BinarySearchTree 47 Stefan retrive insert root 29 Beatrice 73 Jozef print delete 17 Anna 61 Harald 97 Eskel 8 Urban 52 Mats 67 Tobbe 85 Alex 103 Peter 80 Doris Jozef Swiatycki DSV Bild 8 83 Mia

Rekursiv definition av binära träd Ett binärt träd är tomt eller består av en nod och dess vänstersubträd och dess högersubträd och båda subträden är binära träd 47 Stefan Jozef Swiatycki DSV Bild 9

Nodklass för ett binärt träd (ej återanvändbar) class TNode{ int id; String data; TNode left, right; TNode(int i, String d){ id=i; data=d; left=right=null; // Konstruktor Dataattributen är inte skyddade för att få tydligare kod i metodexemplen, de borde givetvis vara deklarerade som private och kunna avläsas med get-metoder public String tostring(){ return id + ": " + data; // tostring // TNode Jozef Swiatycki DSV Bild 10

Klassen BinSearchTree (ej återanvändbar) class BinSearchTree { private TNode root=null; public TNode retrive(int sought){... public void insert(int id, String data){... public void print(){... void delete(int sought){... // BinSearchTree Jozef Swiatycki DSV Bild 11

Rekursiv sökfunktion class BinSearchTree { private TNode root=null; TNode retrivenode(tnode node, int sought){ if (node == null) return null; else if (node.id == sought) return node; else if (node.id > sought) return retrivenode(node.left, sought); else return retrivenode(node.right, sought); // retrivenode Jozef Swiatycki DSV Bild 12

Gränssnittsmetoder och privata metoder Antag deklarationen BinSearchTree tree = new BinSearchTree(); Antag även att några noder har skapats och lagts till trädet tree. Ett anrop av den rekursiva metoden retrivenode skulle behöva se ut så här: Tnode tn = tree.retrivenode(tree.root, 73); Men en tillämpning har inte åtkomst till tree.root, dessutom känns det ondödigt att behöva ange tree.root vid varje anrop av metoden. Man brukar därför skapa publika gränssnittsmetoder som bara är till för att starta rekursionen och privata rekursiva metoder som gör jobbet: class BinSearchTree { private TNode root=null; public TNode retrive(int sought){ return retrivenode(root, sought); private TNode retrivenode(tnode node, int sought){ // som tidigare Jozef Swiatycki DSV Bild 13

Insättning av ny nod i trädet BinarySearchTree 47 Stefan retrive insert root 29 Beatrice 73 Jozef print delete 17 Anna 61 Harald 97 Eskel 8 Urban 52 Mats 67 Tobbe 85 Alex 103 Peter newnode 50 Ola 80 Doris 83 Mia Jozef Swiatycki DSV Bild 14

Kod för insättning av ny nod i trädet class BinSearchTree { private TNode root=null; public void insert(int id, String data){ TNode newnode = new TNode(id, data); root=insertnode(root, newnode); private TNode insertnode(tnode node, TNode newnode){ if (node == null) node = newnode; else if (node.id > newnode.id) node.left = insertnode(node.left, newnode); else node.right = insertnode(node.right, newnode); return node; Jozef Swiatycki DSV Bild 15

Traversering (genomgång) av trädet Exempel: utskrift i sorteringsordning class BinSearchTree { private TNode root=null; public void print(){ printtree(root); private void printtree(tnode node){ if (node!= null){ printtree(node.left); System.out.println(node); printtree(node.right); Jozef Swiatycki DSV Bild 16

Träd - traverseringsordning inorder preorder - vänstra subträdet, noden själv, högra subträdet I binära sökträd ger detta traversering i sorteringsordning - noden själv, vänstra subträdet, högra subträdet private void postorderprint(tnode node){ if (node!= null){ System.out.println(node); printtree(node.left); printtree(node.right); postorder - vänstra subträdet, högra subträdet, noden själv Jozef Swiatycki DSV Bild 17

Borttagning av en nod från trädet private TNode deletenode(tnode node, int sought) throws TreeException { if (node == null) throw new TreeException( No such element! ); else if (node.id > sought) node.left = deletenode(node.left, sought); else if (node.id < sought) node.right = deletenode(node.right, sought); else if (node.left == null) node = node.right; else if (node.right == null) node = node.left; else { TNode tmp=findleftmost(node.right); node.id = tmp.id; node.data = tmp.data; node.right = deleteleftmost(node.right); return node; Jozef Swiatycki DSV Bild 18

Borttagning av en nod från trädet (forts.) public void delete(int sought){ root = deletenode(root, sought); private TNode findleftmost(tnode node){ if (node.left == null) return node; else return findleftmost(node.left); private TNode deleteleftmost(tnode node){ if (node.left == null) return node.right; else { node.left = deleteleftmost(node.left); return node; Jozef Swiatycki DSV Bild 19