INF1010 Rekursive metoder, binære søketrær Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre
public void skrivutmeg ( ) { System. out. println (navn + " er venn med " + minbestevennheter ( ) ) ; public void skrivutallt ( ) { skrivutmeg ( ) ; i f ( hentbestevenn ( )!= null ) hentbestevenn ( ). skrivutallt ( ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 2
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { skrivutmeg ( ) ; i f ( neste!= null ) neste. skrivutmegogresten ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 3
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { skrivutmeg ( ) ; i f ( neste!= null ) neste. skrivutmegogresten ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 4
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { skrivutmeg ( ) ; i f ( neste!= null ) neste. skrivutmegogresten ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 5
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { skrivutmeg ( ) ; i f ( neste!= null ) neste. skrivutmegogresten ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 6
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { skrivutmeg ( ) ; i f ( neste!= null ) neste. skrivutmegogresten ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 7
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { skrivutmeg ( ) ; i f ( neste!= null ) neste. skrivutmegogresten ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 8
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { skrivutmeg ( ) ; i f ( neste!= null ) neste. skrivutmegogresten ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 9
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { skrivutmeg ( ) ; i f ( neste!= null ) neste. skrivutmegogresten ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 10
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { skrivutmeg ( ) ; i f ( neste!= null ) neste. skrivutmegogresten ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 11
michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 12
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { i f ( neste!= null ) neste. skrivutmegogresten ( ) ; skrivutmeg ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 13
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { i f ( neste!= null ) neste. skrivutmegogresten ( ) ; skrivutmeg ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 14
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { i f ( neste!= null ) neste. skrivutmegogresten ( ) ; skrivutmeg ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 15
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { i f ( neste!= null ) neste. skrivutmegogresten ( ) ; skrivutmeg ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 16
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { i f ( neste!= null ) neste. skrivutmegogresten ( ) ; skrivutmeg ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 17
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { i f ( neste!= null ) neste. skrivutmegogresten ( ) ; skrivutmeg ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 18
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { i f ( neste!= null ) neste. skrivutmegogresten ( ) ; skrivutmeg ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 19
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { i f ( neste!= null ) neste. skrivutmegogresten ( ) ; skrivutmeg ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 20
null class ListeElement { Object data ; ListeElement neste ; public void skrivutmegogresten ( ) { i f ( neste!= null ) neste. skrivutmegogresten ( ) ; skrivutmeg ( ) ;... michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 21
class ListeElement { Object data ; ListeElement neste ; public void settinnsist ( ListeElement ny) { i f ( neste == null ) neste = ny; else neste. settinnsist ( ny ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 22
Eksempler på enkle rekursive metoder: Finne maks- eller minimumsverdier skrive ut / traversere hele lista gjøre endringer i hele datastrukturen for utvalgte objekter michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 23
hvorfor er lenkelister en rekursiv datastruktur? er sudokubrettet en lenkeliste? hvilke invariante tilstandspåstander i en lenkeliste må holde for at vi kan programmere rekursivt? Forslag: alle listeelementer har en og bare en nestepeker ingen nestepekere peker på førsteelementet alle andre elementer blir pekt på av en og bare en nestepeker en og bare en nestepeker er null (i siste element) michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 24
Hva er et binærtre? michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 25
michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 26
michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 27
michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 28
michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 29
12 0 2 99 17 37 7 5 9 1 michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 30
7 1 37 0 2 12 99 5 9 17 michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 31
7 1 37 0 2 12 99 rot subtre (barn) dybde (høyde) 5 9 17 michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 32
9 37 1 99 17 5 0 12 7 2 michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 33
Node venstre int 7 verdi Node høyre michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 34
Node venstre int 7 verdi Node høyre class Node { int verdi ; // representerer sorteringskriteriet Node venstre ; // peker til subtreet til venstre Node høyre ; // peker til subtreet til høyre Node ( int i ) { verdi = i ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 35
settinnnode( Node ny ) Node venstre int 7 verdi Node høyre class Node { int verdi ; Node venstre, høyre ;... public void settinnnode ( Node ny ) { i f ( venstre == null ) venstre = ny; else venstre. settinnnode (ny ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 36
settinnnode( Node ny ) Node venstre int 7 verdi Node høyre class Node { int verdi ; Node venstre, høyre ;... public void settinnnode ( Node ny ) { i f ( venstre == null ) venstre = ny; else i f ( høyre == null ) høyre = ny; else venstre. settinnnode (ny ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 37
settinnnode( Node ny ) Node venstre int 7 verdi Node høyre class Node { int verdi ; Node venstre, høyre ;... public void settinnnode ( Node ny ) { i f (ny. verdi > verdi ) <sett inn t i l høyre> else <sett inn t i l venstre> michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 38
settinnnode( Node ny ) Node venstre int 7 verdi Node høyre public void settinnnode ( Node ny ) { i f (ny. verdi > verdi ) i f ( høyre == null ) høyre = ny; else høyre. settinnnode (ny ) ; else i f ( venstre == null ) venstre = ny; else venstre. settinnnode (ny ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 39
void leggtiltre(node<ord> inn) Node<Ord> finnidenneellerunder(node<ord> likdenne) void skrivut() Sterkt forenklet: Node<Ord> venstre Ord denne Node<Ord> høyre kryss int compareto(ord o) void skrivut() kryss String ordet michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 40
Klassen Node<T> class Node <T extends BTNodeRolle <T>> { Node<T> venstre, høyre ; T denne; Node (T t ) { denne = t ; void leggtiltre (Node <T> inn ) Node<T> finnidenneellerunder (Node <T> likdenne ) void skrivut ( ) michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 41
interface BTNodeRolle <T>{ int compareto(t e ) ; void skrivut ( ) ; class Node <T extends BTNodeRolle <T>> { Node<T> venstre, høyre ; T denne; Node (T t ) { denne = t ; void leggtiltre (Node <T> inn ) Node<T> finnidenneellerunder (Node <T> likdenne ) void skrivut ( ) michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 42
class Ord implements BTNodeRolle <Ord> { private String ordet ; Ord ( String s ) { ordet = s ; public int compareto( Ord o) public void skrivut ( ) public class Eksempel1 { public static void main( String [ ] args ) { Node<Ord> rot = new Node<Ord> (new Ord( kryss ) ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 43
Klassen Ord class Ord implements BTNodeRolle <Ord> { private String ordet ; Ord ( String s ) { ordet = s ; public int compareto( Ord o ) { return ordet. comparetoignorecase ( o. ordet ) ; public void skrivut ( ) { System. out. print ( ordet+" " ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 44
Et Node<Ord>-objekt Tilstand i programmet etter setningen Node<Ord> rot = new Node<Ord> (new Ord(kryss")); void leggtiltre(node<ord> inn) Node<Ord> finnidenneellerunder(node<ord> likdenne) Node<Ord> rot void skrivut() Sterkt forenklet: Node<Ord> venstre Ord denne Node<Ord> høyre kryss int compareto(ord o) kryss void skrivut() String ordet Konstruktører: Ord (String s) {ordet = s; Node (T t) {denne = t; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 45
Fra main-metoden Node<Ord> rot = new Node<Ord> (new Ord( " kryss " ) ) ; rot. leggtiltre (new Node<Ord> (new Ord( "hanske" ) ) ) ; rot. leggtiltre (new Node<Ord> (new Ord( " angre " ) ) ) ; rot. leggtiltre (new Node<Ord> (new Ord( " nikkel " ) ) ) ; rot. leggtiltre (new Node<Ord> (new Ord( " ansvar " ) ) ) ; rot. leggtiltre (new Node<Ord> (new Ord( " juletre " ) ) ) ; rot. leggtiltre (new Node<Ord> (new Ord( " trøffel " ) ) ) ; rot. leggtiltre (new Node<Ord> (new Ord( " hylle " ) ) ) ; rot. leggtiltre (new Node<Ord> (new Ord( " adrenalin " ) ) ) ; rot. leggtiltre (new Node<Ord> (new Ord( " laser " ) ) ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 46
Settinnmetoden i Node<T> void leggtiltre (Node <T> inn ) { int smnlgn = denne. compareto( inn. denne ) ; i f ( smnlgn < 0 ) i f ( høyre == null ) høyre = inn ; else høyre. leggtiltre ( inn ) ; else i f ( venstre == null ) venstre = inn ; else venstre. leggtiltre ( inn ) ; Hva skjer med like objekter? michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 47
Node<Ord> rot kryss hanske Datastruktur ved kall på settinn-metoden (over) og resultat (under) Node<Ord> rot kryss hanske michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 48
Node<Ord> rot kryss angre hanske void leggtiltre (Node <T> inn ) { int smnlgn = denne. compareto( inn. denne ) ; i f ( smnlgn < 0 ) i f ( høyre == null ) høyre = inn ; else høyre. leggtiltre ( inn ) ; else i f ( venstre == null ) venstre = inn ; else venstre. leggtiltre ( inn ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 49
Node<Ord> rot kryss hanske angre void leggtiltre (Node <T> inn ) { int smnlgn = denne. compareto( inn. denne ) ; i f ( smnlgn < 0 ) i f ( høyre == null ) høyre = inn ; else høyre. leggtiltre ( inn ) ; else i f ( venstre == null ) venstre = inn ; else venstre. leggtiltre ( inn ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 50
Node<Ord> rot kryss hanske angre void leggtiltre (Node <T> inn ) { int smnlgn = denne. compareto( inn. denne ) ; i f ( smnlgn < 0 ) i f ( høyre == null ) høyre = inn ; else høyre. leggtiltre ( inn ) ; else i f ( venstre == null ) venstre = inn ; else venstre. leggtiltre ( inn ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 51
Node<Ord> rot kryss kryss hanske angre nikkel ansvar juletre trøffel hylle adrenalin laser michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 52
Node<Ord> rot kryss hanske kryss hanske angre nikkel ansvar juletre trøffel hylle adrenalin laser michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 53
Node<Ord> rot kryss angre hanske kryss hanske angre nikkel ansvar juletre trøffel hylle adrenalin laser michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 54
Node<Ord> rot kryss angre hanske kryss hanske angre nikkel ansvar juletre trøffel hylle adrenalin laser nikkel michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 55
Node<Ord> rot kryss angre hanske ansvar kryss hanske angre nikkel ansvar juletre trøffel hylle adrenalin laser nikkel michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 56
Node<Ord> rot kryss angre hanske ansvar juletre kryss hanske angre nikkel ansvar juletre trøffel hylle adrenalin laser nikkel michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 57
Node<Ord> rot kryss angre hanske ansvar juletre kryss hanske angre nikkel ansvar juletre trøffel hylle adrenalin laser nikkel trøffel michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 58
Node<Ord> rot kryss angre hanske ansvar juletre hylle kryss hanske angre nikkel ansvar juletre trøffel hylle adrenalin laser nikkel trøffel michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 59
Node<Ord> rot kryss adrenalin angre hanske ansvar juletre hylle kryss hanske angre nikkel ansvar juletre trøffel hylle adrenalin laser nikkel trøffel michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 60
Node<Ord> rot kryss adrenalin angre hanske ansvar juletre hylle kryss hanske angre nikkel ansvar juletre trøffel hylle adrenalin laser laser nikkel trøffel michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 61
Finnmetoden i Node<T> Node<T> finnidenneellerunder (Node <T> likdenne ) { Node<T> fantdette ; int smnlgn = denne. compareto( likdenne. denne ) ; i f ( smnlgn < 0 ) i f ( høyre == null ) fantdette = null ; else fantdette = høyre. finnidenneellerunder ( likdenne ) ; else i f ( smnlgn > 0 ) i f ( venstre == null ) fantdette = null ; else fantdette = venstre. finnidenneellerunder ( likdenne ) ; else // smnlgn == 0, dvs. dette er noden det letes etter fantdette = this ; return fantdette ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 62
Node<Ord> rot kryss hanske nikkel angre juletre laser trøffel adrenalin ansvar hylle Node<Ord> funnet = rot. finnidenneellerunder (new Node<Ord> (new Ord( " hanske" ) ) ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 63
Node<Ord> rot kryss hanske nikkel angre juletre laser trøffel adrenalin ansvar hylle funnet. skrivut ( ) ; michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 64
Skrivutmetoden i Node<T> void skrivut ( ) { i f ( venstre!= null ) venstre. skrivut ( ) ; denne. skrivut ( ) ; i f ( høyre!= null ) høyre. skrivut ( ) ; NB! Rekkefølgen på skrivut-kallene vil forandre rekkefølgen. Metoden som er vist skriver ut objektene i alfabetisk stigende rekkefølge. Hvorfor? michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 65
Hva må du kunne om binære søketrær i INF1010 Lage programmer som 1. bygger opp et binært søketre (sette inn objekter) 2. finner igjen et objekt i et binært søketre 3. traverserer hele treet (f.eks. skriver ut alle objektene) 4. gjør om et binært søketre til en sortert liste 5. gjør om en usortert liste til et binært søketre (samme som 1.) Du skal også kunne gjøre rede for tilstandspåstandene som ligger til grunn for at en datastruktur skal være et binært søketre. Vil du vite mer om binære søketrær, kan denne wikipediaartikkelen være et greit utgangspunkt: http://en.wikipedia.org/wiki/binary_search_tree michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 66
Tilstandspåstander et binært søketre (BST) består av 0 til n noder (noder) For alle noder i et BST gjelder: en node har en konstant verdi og en compareto-metode som er veldefinert når noden sammenlignes med andre noder en node har pekere til to BST (subtrær), v og h. alle nodene i venstre subtre (hvis ikke tomt) har verdier som er mindre enn eller lik nodens verdi basert på returverdien til nodens compareto-metode. alle nodene i høyre subtre har verdier som er større enn eller lik nodens verdi basert på returverdien til nodens compareto-metode. michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 67
Fra binærtre til liste Node<Ord> rot kryss hanske nikkel angre juletre laser trøffel adrenalin ansvar hylle Liste er en enklere struktur å lage en iterator over. michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 68
Node<Ord> rot kryss hanske nikkel angre juletre laser trøffel adrenalin ansvar hylle michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 69
Node<Ord> rot kryss Node<Ord> liste hanske nikkel angre juletre laser trøffel adrenalin ansvar hylle michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 70
Et objekt av klassen Tre<Ord> Svarte nodeobjekter er av den indre klassen Node i Tre kryss Et objekt av klassen Liste<Ord> hanske nikkel angre juletre laser trøffel Grønne objekter er av klassen Ord adrenalin ansvar hylle Røde nodeobjekter er objekter av den indre nodeklassen i Liste michael@ifi.uio.no INF1010 18. april 2013 (uke 16) 71