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

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

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

Föreläsning 9 Innehåll

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

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

Algoritmer och datastrukturer 2012, föreläsning 6

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

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

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

Föreläsning 9 Innehåll

Föreläsning Datastrukturer (DAT036)

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

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

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

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

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

Abstrakta datastrukturer

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Symboliska konstanter const

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

Algoritmer och datastrukturer 2012, fo rela sning 8

Trädstrukturer och grafer

Lösningar Datastrukturer TDA

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

729G04: Inlämningsuppgift Diskret matematik

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

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Träd Hierarkiska strukturer

DAI2 (TIDAL) + I2 (TKIEK)

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Föreläsning Datastrukturer (DAT036)

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

Föreläsning 10 Innehåll

TDIU01 Programmering i C++

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

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

Datastrukturer. Föreläsning 5. Maps 1

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

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

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

Träd. Kapitel Definition av träd

Tentamen Datastrukturer, DAT037 (DAT036)

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

Datastrukturer. föreläsning 10. Maps 1

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

Föreläsning 10 Datastrukturer (DAT037)

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

Informationsteknologi Tom Smedsaas 19 augusti 2016

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

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

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

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

Vad har vi pratat om i kursen?

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, Algoritmer och datastrukturer

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

Föreläsning 4 Datastrukturer (DAT037)

TDDI16 Datastrukturer och algoritmer. Prioritetsköer, heapar, Union/Find

#include <stdio.h> #include <string.h>

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

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

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

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

Föreläsning Datastrukturer (DAT036)

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

Algoritmer och datastrukturer

Föreläsning 3 Datastrukturer (DAT037)

Programkonstruktion och. Datastrukturer

Lösningsförslag till exempeltenta 1

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

TDDC74 Programmering, abstraktion och modellering DUGGA 2

Tentamen Datastrukturer, DAT037 (DAT036)

Tentamen TEN1 HI

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

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 4 Datastrukturer (DAT037)

Tentamen *:58/ID100V Programmering i C Exempel 3

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

13 Prioritetsköer, heapar

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

Tentamen Datastrukturer (DAT036)

BST implementering, huvudstruktur

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Tentamen TEN1 HI

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Ä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.

Seminarium 13 Innehåll

Måndag 13 mars 2017 kl Rita en KMP-automat för CAMCORDERCAMERA samt ange next-vektorn.

Datastrukturer. föreläsning 9. Maps 1

Programmering II (ID1019) :00-17:00

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

Tentamen Datastrukturer för D2 DAT 035

Länkade strukturer, parametriserade typer och undantag

Transkript:

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

Terminologi - träd Ett träd i datalogi består av en rotnod och ett ändligt antal underträd (subtrees) Trädets höjd är antalet nivåer (4 i exemplet). nivå 0 nivå 1 nivå 2 nivå 3 Ett träd är en graf där man kan ta sig mellan två noder på endast ett sätt. N noder ger N-1 bågar. Vi kommer främst titta på binära träd.

Binära träd Ett binärt träd är ett träd där varje nod har maximalt 2 barn Definition: Ett binärt träd är antingen tomt eller så har rotnoden 2 underträd (subtree) som också är binära träd (vänster och höger underträd).

Binärt sökträd (BST) Ett binärt sökträd är ett binärt träd som är ordnat efter nodernas nycklar För godtycklig nod gäller alla nycklar i nodens vänstra underträdet är mindre än nodens nyckel alla nycklar i nodens högra underträdet är större än nodens nyckel vänster och höger underträd är också binära sökträd varje nod är unik (inga kopior)

Traversera Att besöka alla noder i ett träd kallas att traversera trädet. Tre traverseringsordningar: Inorder. Besök först trädets vänstra del, sedan noden själv och sist trädets högra del. (1,2,3,4,5,6,7) Preorder. Besök först noden själv, sedan trädets vänstra del och sist trädets högra del. (4,2,1,3,6,5,7) Postorder. Besök först trädets vänstra del, sedan trädets högra del och sist noden själv. (1,3,2,5,7,6,4) Normalt använder vi inorder.

Binärt sökträd som ADT Är skapat för att lätt kunna söka och lägga till och ta ut (log n). För att det ska fungera måste trädet vara bra balanserat. Operationer: searchtree(nyckel) inserttree(element) deletetree(nyckel)

binarysearchtree.h typedef struct{ char key[wordlength]; Data; typedef struct treenode TreeNode; struct treenode{ Data element; TreeNode *left, *right; ; typedef struct{ TreeNode *root; BinaryTree; BinaryTree *initbinarytree(); void inserttree(binarytree *bp,data e); void inorder(binarytree *bp); Data *searchtree(binarytree *bp,char key[]);

binarysearchtree.c - initiera #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> #include "binarysearchtree.h" BinaryTree *initbinarytree() { BinaryTree *bp = (BinaryTree*)malloc(sizeof(BinaryTree)); bp->root = NULL; return bp;

binarysearchtree.c - traversera void inorder(binarytree *bp) { inordernode(bp->root); void inordernode(treenode *np) { if(np!=null) { inordernode(np->left); printf("%s,",(np->element).key); inordernode(np->right); Det här extrasteget hade vi sluppit om vi inte använt en speciell datastruktur för att representera ett träd utan helt enkelt använt en pekare av typen TreeNode och kallat den root. Det steget kommer nu behövas på alla funktioner vi väljer att lösa rekursivt.

binarysearchtree.c sätta in void inserttree(binarytree *bp,data e) { TreeNode *newnode = (TreeNode*)malloc(sizeof(TreeNode)); newnode->element = e; newnode->left=newnode->right=null; if(bp->root==null) bp->root=newnode; else insertnodeintree(bp->root,newnode);

binarysearchtree.c sätta in void insertnodeintree(treenode *tree,treenode *newnode) { int komp=strcmp((tree->element).key,(newnode->element).key); assert(komp!=0); if(komp<0) { if(tree->right==null) tree->right=newnode; else insertnodeintree(tree->right,newnode); else { if(tree->left==null) tree->left=newnode; else insertnodeintree(tree->left,newnode);

binarysearchtree.c - söka Data *searchtree(binarytree *bp,char key[]) { if(bp->root==null) return NULL; else { TreeNode *found = searchtreenode(bp->root, key); if(found!=null) return &(found->element); else return NULL;

binarysearchtree.c - söka TreeNode *searchtreenode(treenode *tree, char key[]) { int komp=strcmp((tree->element).key,key); if(komp==0) return tree; else if(komp<0){ if(tree->right==null) return NULL; else return searchtreenode(tree->right,key); else{ if(tree->left==null) return NULL; else return searchtreenode(tree->left,key);

Ta bort från binärt sökträd Det finns tre fall att ta hänsyn till när vi tar bort en nod: noden är ett löv noden har bara ett subträd noden har både vänster och höger subträd Fall 1 är trivialt: vi sätter helt enkelt förälderns relevanta subträd till NULL

Noden har bara ett subträd Också relativt enkelt. Vi ersätter helt enkelt noden med dess barn. Ex: Vi ska ta bort 4: 8 8 4 9 9 6 6 5 7 5 7

Noden har både vänster och höger subträd Vi måste nu lösa vad vi ska göra med de två barnen. Lösningen är att vi ersätter noden med den minsta noden i det högra underträdet. Denna kan inte ha något vänsterbarn (den är ju minst) och därmed lätta att ta bort (fall 2) Ex: vi vill ta bort nod B. H H B N C N A E A E C F F D D

deletenode För att implementera deletetree kommer vi att skapa en intern hjälpfunktion som tar som parameter en pekare till noden som ska tas bort och returnerar en pekare till rotnoden till det nya subträdet. I exemplet nedan skickar man in en pekare till B och funktionen returnerar en pekare till C med underträdet i den högra bilden: H H B N C N A E A E C F F D D

deletenode - hjälpfunktion TreeNode *deletenode(treenode *np){ TreeNode *newsubtree; if(np==null) return NULL; else if(np->right==null){ H newsubtree=np->left; B free(np); return newsubtree; A else if(np->left==null){ H newsubtree=np->right; B free(np); return newsubtree; E else{ N N

hjälpfunktion forts. TreeNode *parenttomin; TreeNode *minofrighttree; H minofrighttree = np->right; if(minofrighttree->left==null){ B N minofrighttree->left=np->left; free(np); A E return minofrighttree; F while(minofrighttree->left!=null){ parenttomin = minofrighttree; minofrighttree = minofrighttree->left; min parenttomin->left = minofrighttree->right; minofrighttree->left=np->left; minofrighttree->right=np->right; free(np); return minofrighttree; A B C E D H F N parent

deletenode -gränssnittsfunktion Data deletetree(binarytree *bp,char key[]){ Data d; bp->root=deletenodetree(bp->root,key,&d); return d; Observera hur deletnodetree ska returnera en pekare till hela det nya trädet! Den kommer sedan rekursivt leta sig ner i trädet mot rätt nod och hela tiden returnera en pekare till trädet där den är tills den hittar rätt nod. Då skickar den denna till vår hjälpfunktion som returnerar en pekare till det nya trädet.

deletenode söker upp rätt nod TreeNode *deletenodetree(treenode *tree,char key[],data *d){ int komp=strcmp((tree->element).key,key); if(komp==0){ *d = tree->element; return deletenode(tree); else if(komp<0){ if(tree->right==null) return tree;//fanns ej else{ tree->right = deletenodetree(tree->right,key,d); return tree; else{ if(tree->left==null) return tree;//fanns ej else{ tree->left = deletenodetree(tree->left,key,d); return tree;

Inlämningsuppgifter Följande uppgifter redovisas senast måndag den 6 februari och kan inte redovisas senare: 5.5, 5.A, 5.B, 5.C/5.7, 5.D, 5.E Dessa uppgifter bör göras nu för att ni ska kunna följa kursen på ett bra sätt. Övriga kan ni göra vid tillfälle för högre betyg.

Uppgifter ej i boken Utgå från föreläsningens implementering av ett binärt sökträd när du löser nedanstående uppgifter 5.A Skriv en main som läser in sju ord från användaren och placerar dessa i ett BST. Kör programmet och skriv in 7 ord så att trädet får minsta möjliga höjd. Kör programmet och skriv in 7 ord så att trädet får maximal höjd. (2p) 5.B Skriv funktioner som traverserar trädet med preorder och inorder. (1p) 5.C Skriv två funktioner numberofleaves och numberofnodes till vår implementation från föreläsningen. (2p) 5.D Skriv om sökfunktionen så att den är iterativ istället för rekursiv. (3p) 5.E Skriv en funktion maximum som returnerar det största värdet i ett binärt sökträd. Skriv en rekursiv och en iterativ version. (2p)