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

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

Dugga Datastrukturer (DAT036)

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

Föreläsning 13 och 14: Binära träd

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

Föreläsning Datastrukturer (DAT036)

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 6: Introduktion av listor

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

Algoritmer och datastrukturer 2012, föreläsning 6

Tentamen TEN1 HI

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

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

Tentamen Datastrukturer D DAT 036/DIT960

Träd Hierarkiska strukturer

Trädstrukturer och grafer

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

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

Föreläsning 9 Innehåll

Sätt att skriva ut binärträd

Grafer. 1 Grafer. Grunder i matematik och logik (2015) 1.1 Oriktade grafer. Marco Kuhlmann

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

Innehåll. Föreläsning 11. Organisation av Trie. Trie Ytterligare en variant av träd. Vi har tidigare sett: Informell specifikation

Tentamen Datastrukturer, DAT037 (DAT036)

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

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

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

Föreläsning 9 Innehåll

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

Föreläsning 3 Datastrukturer (DAT037)

Rekursion. Koffman & Wolfgang kapitel 5

Lösningar Datastrukturer TDA

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Objektorienterad programmering D2

Föreläsning Datastrukturer (DAT036)

Tentamen, Algoritmer och datastrukturer

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

Tentamen i Objektorienterad programmering

DAI2 (TIDAL) + I2 (TKIEK)

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

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

Föreläsning 3 Datastrukturer (DAT037)

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen OOP

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Föreläsning 4: Kombinatorisk sökning

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

Lösningsförslag till exempeltenta 1

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

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Algoritmer och datastrukturer 2012, fo rela sning 8

Omtentamen (del 1, 6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

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

Fredag 10 juni 2016 kl 8 12

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

OOP Objekt-orienterad programmering

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

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen Datastrukturer, DAT037 (DAT036)

BST implementering, huvudstruktur

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

Föreläsning 10 Datastrukturer (DAT037)

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 Datastrukturer (DAT036)

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

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

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

Försättsblad till skriftlig tentamen vid Linköpings Universitet

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

Tentamen på kursen DA7351, Programmering , kl Malmö högskola Teknik och samhälle. DA7351, Programmering

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

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

Introduktion till algoritmer - Lektion 3 Matematikgymnasiet, Läsåret Lektion 3

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

Exempeltenta GruDat 2002/2003

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

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

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

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

Föreläsning 2 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 27 maj 2008

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

public boolean containskey(string key) { return search(key, head)!= null; }

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

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

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

SORTERING OCH SÖKNING

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Datastrukturer. Föreläsning 5. Maps 1

Transkript:

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

Träd Träd är ickelinjära och hierarkiska: i motsats till listor och fält en trädnod kan ha flera efterföljare ( barn ) men bara en föregångare ( förälder ) Träd är en rekursiv datastruktur Exempel på strukturer som kan lagras i träd: Javas klasshierarki en katalog på hårddisken, och dess underkataloger ett familjeträd 2

Binära träd Vi fokuserar på binära träd: varje nod har maximalt två barn Binära träd kan implementeras som: en länkad struktur binära sökträd, avsnitt 6.4 ett fält heap, avsnitt 6.5 3

Terminologi roten en nods nivå = 1 + avståndet till roten en träds höjd = den största nivån förälder owl gren hamster penguin barn gorilla lemur wolf ape syskon löv 4 delträd

Exempel: Huffmanträd Ett Huffmanträd används för att representera en Huffmankod Exempel d : 10110 s : 0011 5

Binära sökträd I ett binärt sökträd är alla noder i det vänstra delträdet mindre än föräldern, som i sin tur är mindre än alla noder i det högra delträdet hamster owl penguin Eller, mer formellt: gorilla lemur wolf T är ett sökträd omm T är tomt, eller: T har två barn, TL och TR, som är binära sökträd, och värdet i T:s rotnod är större än alla värden i TL, och värdet i T:s rotnod är mindre än alla värden i TR Detta är en invariant, som man kan använda för att kontrollera att ens kod är korrekt 6

Sökning i binära sökträd Att söka efter target i ett binärt sökträd: om trädet är tomt: return null annars, om target matchar rotnodens data: return rotnodens data annars, om target är mindre än rotnodens data: sök efter target i vänstra delträdet annars är target större än rotnodens data: sök efter target i högra delträdet 7

Sökning i binära sökträd BST-sökning har potential att få logaritmisk komplexitet, O(log n) Men i värsta fall är sökningen linjär, O(n) om trädet är väldigt skevt: 8

Perfekta binära träd Ett perfekt binärt träd är ett binärt träd med 3 höjd n som har exakt 2 n 1 noder 1 5 I detta fall är n = 3 0 2 4 6 och 2 n 1 = 7 9

Nivåbalanserade binära träd Ett nivåbalanserat (fullständigt/complete) 3 binärt träd är ett perfekt binärt träd 1 5 (ner till nivå n 1), 0 2 4 med några extra löv på nivå n, där alla ligger till vänster 10

Generella träd Noderna i generella träd kan ha hur många barn som helst 11

Binärisering av generella träd Ett generellt träd kan representeras av ett binärt träd: första barnet blir ett vänsterbarn dess högersyskon blir ett högerbarn vars högersyskon blir högerbarn 12

Trädtraversering Preorder: besök rotnoden, sedan TL, sedan TR Inorder: besök TL, sedan rotnoden, sedan TR Postorder: besök TL, sedan TR, sedan rotnoden 13

Trädtraversering You can visualize a tree traversal by imagining a mouse that walks along the edge of the tree If the mouse always keeps the tree to the left, it will trace a route known as the Euler tour The Euler tour is the path traced in blue in the figure on the right 14

Preorder Musen besöker varje nod innan den besöker delträden. (De nedåtpekande pilarna). I dethär fallet blir det: a b d g e h c f i j 15

Inorder Musen besöker först det vänstra delträdet, sedan noden, och sist det högra delträdet. (Högerpilarna). I dethär fallet blir det: d g b h e a i f j c 16

Postorder Musen besöker noden efter att den har besökt delträden. (De nedåtpekande pilarna). I dethär fallet blir det: g d h e b i j f c a 17

Inordertraversering av sökträd Om vi besöker noderna owl i ett binärt sökträd inorder så får vi ut noderna sorterade. hamster penguin I detta fall: gorilla lemur wolf gorilla, hamster, lemur, owl, penguin, wolf 18

Att implementera binära träd Klassen Node<E>: en nod består av länkar till sina efterföljare precis som länkade listor fast nu är det två länkar istället för en 19

20 Klassen BinaryTree<E>

Klassen BinaryTree<E> antag att detta är bt 20

Klassen BinaryTree<E> då är detta bt.root.data antag att detta är bt 20

Klassen BinaryTree<E> då är detta bt.root.data antag att detta är bt och detta bt.root.right 20

Klassen BinaryTree<E> då är detta bt.root.data antag att detta är bt och detta bt.root.right och detta bt.root.left.right.data 20

21 Klassen BinaryTree<E>

Konstruerare public BinaryTree( E data, BinaryTree<E> lefttree, BinaryTree<E> righttree) { root = new Node<E>(data); if (lefttree!= null) root.left = lefttree.root; else root.left = null; } if (righttree!= null) root.right = righttree.root; else root.right = null; 22

Konstruerare public BinaryTree( E data, BinaryTree<E> lefttree, BinaryTree<E> righttree) { root = new Node<E>(data); if (lefttree!= null) root.left = lefttree.root; else root.left = null; i de flesta trädmetoder behöver vi kontrollera om någon pekare är null } if (righttree!= null) root.right = righttree.root; else root.right = null; 22

Binära sökträd I ett binärt sökträd är alla noder i det vänstra delträdet mindre än föräldern, som i sin tur är mindre än alla noder i det högra delträdet 23

Sökning i ett binärt sökträd Algoritm search(binarytree<e> tree, E target): return searchnode(tree.root) Rekursiv privat algoritm searchnode(node<e> node): om node == null: return null om target == node.data: return node.data om target < node.data: return searchnode(node.left) om target > node.data: return searchnode(node.right) Jämför likheten med binärsökning i ett fält. (föreläsningen om rekursion). 24

Iterativ sökning Precis som med binärsökning i fält så går det att implementera iterativt Iterativ algoritm search(binarytree<e> tree, E target): node = tree.root repetera ända tills node == null: om target == node.data: return node.data om target < node.data: node = node.left om target > node.data: node = node.right return null 25

Sökning, exempel Att söka efter kept i sökträdet kräver bara 4 jämförelser. 26

Effektivitet Om trädet är balanserat (eller nästan balanserat) blir sökningen logaritmisk, O(log n) I värsta fall har trädet bara högerdelträd (eller vänster-), och då blir sökningen linjär, O(n) 27

Klassen BinarySearchTree<E> Figur 6.15, sid 318 28

Att lägga till element Metoden add(e item) anropar metoden add(root, item). Rekursiv algoritm add(node<e> node, E item): om node == null: node = new Node<E>(item) om item < node.data: node.left = add(node.left, item) om item > node.data: node.right = add(node.right, item) return node 29

Att lägga till element hemläxa: formulera och implementera en iterativ varint Metoden add(e item) anropar metoden add(root, item). Rekursiv algoritm add(node<e> node, E item): om node == null: node = new Node<E>(item) om item < node.data: node.left = add(node.left, item) om item > node.data: node.right = add(node.right, item) return node 29

Att ta bort element Först letar vi förstås upp noden som ska tas bort men vi ser till att komma ihåg dess förälder Om noden inte har några barn: ta bort förälderns referens till noden Om noden bara har ett barn: peka om förälderns referens till nodens enda barn 30

Ta bort en nod med ett barn Noden is har ett enda barn 31

Ta bort en nod med två barn Om noden har två barn, så ersätter vi nodens data med det största elementet i det vänstra delträdet det är alltså inorder-föregångaren det går också att ersätta med det minsta elementet i det högra delträdet 32

Ännu ett exempel rat har två barn och ersätts av priest men priest har ett vänsterbarn, morn, som då måste flyttas upp 33

34 Algoritm för att ta bort element

Algoritm för att ta bort element avancerad hemläxa: formulera och implementera en iterativ variant 34

Att kontrollera ett sökträd Implementera en kontroll av datastrukturens invariant: public boolean issearchtree() { return checknode(root); } private boolean checknode(node<e> node) { if (node == null) return true; if (!checknode(node.left)) return false; for (E x : alldatavalues(node.left)) if (x node.data) return false; if (!checknode(node.right)) return false; for (E x : alldatavalues(node.right)) if (x node.data) return false; return true; } Denna metod kan sedan stoppas in i en assert när du tillverkar dina egna metoder, som en kontroll. Se mer på Oracles Javasidor: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html 35

Att kontrollera ett sökträd Implementera en kontroll av datastrukturens invariant: public boolean issearchtree() { return checknode(root); } private boolean checknode(node<e> node) { if (node == null) return true; if (!checknode(node.left)) return false; for (E x : alldatavalues(node.left)) if (x node.data) return false; if (!checknode(node.right)) return false; for (E x : alldatavalues(node.right)) if (x node.data) return false; return true; } du måste implementera denhär metoden också, och den måste fungera även om argumentet är null Denna metod kan sedan stoppas in i en assert när du tillverkar dina egna metoder, som en kontroll. Se mer på Oracles Javasidor: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html 35