Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

Like dokumenter
Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

INF1010 Binære søketrær ++

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

INF1010 siste begreper før oblig 2

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

INF1010. Grensesnittet Comparable<T>

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

Seminaroppgaver IN1010, uke 2

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

klassen Vin må få en ny variabel Vin neste alle personvariable (personpekere) i listeklassen må byttes til Vin

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

UNIVERSITETET I OSLO

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

UNIVERSITETET I OSLO

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1000: Forelesning 7

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

Algoritmer og Datastrukturer

INF1010. Stein Michael Storleer (michael) Lenkelister

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Dagens tema INF1010 INF1010 INF1010 INF1010

INF Notater. Veronika Heimsbakk 10. juni 2012

INF1000: Forelesning 7. Konstruktører Static

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

1. Krav til klasseparametre 2. Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1010 e-postadresser

INF1010 våren Grensesnitt

IN1010 våren januar. Objektorientering i Java

Algoritmer og datastrukturer Løsningsforslag

Dagens forelesning. INF1010 Datastrukturer Lister og køer Pekerkjedelister Øvelser. Innhold i dette lysarksettet

Eksempel: Uttrykkstrær I uttrykkstrær inneholder bladnodene operander (konstanter, variable,... ), mens de interne nodene inneholder operatorer.

UNIVERSITETET I OSLO

INF1010 våren januar. Objektorientering i Java

2 Om statiske variable/konstanter og statiske metoder.

Velkommen til INF1010

UNIVERSITETET I OSLO

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

Generelle trær BINÆRTRÆR. Binærtrær

Lenkelister. Lister og køer.

Post-it spørsmål fra timen (Arv og subklasser)

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Det finnes ingenting. som kan gjøres med interface. men som ikke kan gjøres uten

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1010 våren Grensesnitt

Studieaktiviteter i INF1010

Algoritmer og datastrukturer Eksamen

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 10 sider inklusiv vedlegg og denne forsiden.

Vanlige datastrukturer. I dette lysarksettet

INF1010, 21. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Operasjoner på lenkede lister (enkeltlenket) Eksempel på en lenket liste: personliste. INF januar 2010 (uke 3) 2

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Algoritmer og datastrukturer Eksamen

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Versjon (vil bli endret).

INF1010 våren Arv og subklasser del 1

INF1010 våren Arv og subklasser del 1

INF1010 våren Grensesnitt (interface)

Obligatorisk oppgave 4: Lege/Resept

Løsnings forslag i java In115, Våren 1996

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

Sortering med Comparable og Comparator

Gjennomgang av eksamen H99

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

UNIVERSITETET I OSLO

2 Om statiske variable/konstanter og statiske metoder.

INF 1010, vår 2005 Løsningsforslag uke 11

Oppgave 1 LØSNINGSFORSLAG. Eksamen i INF desember Betrakt følgende vektede, urettede graf:

Kapittel 9: Sortering og søking Kort versjon

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Dagens plan: INF Algoritmer og datastrukturer. Repetisjon: Binære søketrær. Repetisjon: Binære søketrær

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Algoritmer og datastrukturer Eksamen 22. februar 2011

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Eksamen

Løsningsforslag Test 2

INF1010 Arv. Marit Nybakken 2. februar 2004

Fagnr: A. Ant. vedlegg: 1 (2 sider)

INF1010, 23. februar Parametriserte klasser Om å gå gjennom egne beholdere (subklasser og grensesnitt 3)

INF Seminaroppgaver til uke 3

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

INF1010 våren Arv og subklasser - del 2

UNIVERSITETET I OSLO

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

INF1010 våren februar. Arv og subklasser, del 2

Lenkelister og beholdere av lenkelister

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

Transkript:

Godkjent oblig 1? Les e-post til din UiO-adresse Svar på e-post fra lablærer Ingen godkjenning før avholdt møte med lablærer Godkjentlistene brukes ikke til å informere om status for obligene Ta vare på all e-post om obliger

Dagens forelesning Eks 1: Binærtre Motivasjon for eksemplet Klassestruktur Java datastruktur Binærtretraversering Gjøre noe i hele treet = kalle på samme metode i alle objekten Eks 2: Binærtre og stakk Idé Java datastruktur Klassestruktur

Motivasjon for eksemplet I det følgende eksempel, er motivet å vise et eksempel på bruk av grenesnitt, subklasser, abstrakte klasser og generiske typer i en pekerkjedestruktur, et binærtre. Eksemplet må av pedagogiske grunner være kort, og vil framstå som unødig «overlesset». Hovedideen er å bruke grensnitt og subklasser for å skille ut det som har med binærtrestrukturen å gjøre. Generisk type brukes for å definere selve binærtreet, slik at det kan brukes på alle objekter som har de rette strukturelementene (kan spille rollen «inngå i et binærtre»).

Klassestruktur Et grensesnitt som beskriver rollen BTelemRolle En (abstrakt) klasse BTelem som implementer BTelemRolle En klasse som utvider BTelem og beskriver objektene (personene) En generisk klasse BTre som kan lage binære trær av objekter som er subklasser av BTelem (og indirekte implementerer BTelemRolle)

Klassestruktur Klassestruktur 1 interface BTelemRolle {... } 2 abstract class BTelem implements BTelemRolle {... } 3 class INF1010Person extends BTelem {... } 4 class BTre <T extends BTelem> {... } 5 class GBTeksempel { 6 public static void main( String [ ] args ) { 7 BTre <INF1010Person> INF1010PersonTre = 8 new BTre <INF1010Person >(); 9 } 10 }

Klassestruktur Rollen binærtreelement 1 interface BTelemRolle { 2 public Object hentvsubtrepeker ( ) ; 3 public Object henthsubtrepeker ( ) ; 4 public void setthsubtrepeker( Object o ) ; 5 public void settvsubtrepeker ( Object o ) ; 6 public void leggtilbtre ( Object o ) ; 7 }

Klassestruktur Klassen som beskriver et objekt som kan spille binærtreelementrollen 1 abstract class BTelem implements BTelemRolle { 2 private BTelem venstre, høyre ; 3 abstract int sammenlign( Object o ) ; 4 abstract void skrivut ( ) ; 5 public BTelem hentvsubtrepeker ( ) { return venstre ; } 6 public BTelem henthsubtrepeker ( ) { return høyre ; } 7 public void setthsubtrepeker( Object o) { høyre = ( BTelem) o; } 8 public void settvsubtrepeker ( Object o) { venstre = ( BTelem) o; 9 public void leggtilbtre ( Object inn ) {... } 10 }

Klassestruktur Klassen som beskriver objektene som skal inn i treet 1 class INF1010Person extends BTelem { 2 private String navn; 3 INF1010Person ( String n) { navn = n; } 4 int sammenlign( Object bte ) { 5 return navn.comparetoignorecase ( ( ( INF1010Person ) bte ).navn 6 } 7 String hentnavn ( ) { return navn; } 8 void skrivut ( ) { } 9 }

Java datastruktur BTelem hentvsubtrepeker BTelem henthsubtrepeker void settvsubtrepeker void setthsubtrepeker void leggtilbtre venstre BTelem INF1010Person høyre BTelem void skrivut String hentnavn int sammenlign navn Et INF1010Personobjekt String

Java datastruktur navn String INF1010Person void skrivut String hentnavn int sammenlign BTelem hentvsubtrepeker BTelem henthsubtrepeker void settvsubtrepeker void setthsubtrepeker void leggtilbtre Vi flytter litt på innholdet venstre BTelem høyre BTelem

Java datastruktur Vi forminsker og forenkler objektet navn INF1010Person String void skrivut String hentnavn int sammenlign BTelem hentvsubtrepeker BTelem henthsubtrepeker void settvsubtrepeker void setthsubtrepeker void leggtilbtre venstre høyre BTelem BTelem

Java datastruktur Klassen som beskriver objektet som inneholder binærtreet 1 class BTre <T extends BTelem> { 2 private T rot ; 3 4 public void settinn (T inn ) { 5 if ( rot == null ) rot = inn ; 6 else rot. leggtilbtre ( inn ) ; 7 } 8 9 public void skrivut ( ) { 10 if ( rot!= null ) rot. skrivut ( ) ; 11 } 12 }

Java datastruktur Hvor langt har main-metoden kjørt? kristhk haavand nikolark andrepar

Java datastruktur rot kristhk INF1010person INF1010PersonTre BTre haavand niko andrepar

Java datastruktur kristhk rot haavand nikolark andrepar

Java datastruktur Koden i main som skaper datastrukturen i skissen på forrige lysark 1 public class GBTeksempel{ 2 public static void main( String [ ] args ) { 3 BTre <INF1010Person> INF1010PersonTre = 4 new BTre <INF1010Person >(); 5 INF1010PersonTre. settinn (new INF1010Person ( kristhk ) ) ; 6 INF1010PersonTre. settinn (new INF1010Person ( haavaand ) ) 7 INF1010PersonTre. settinn (new INF1010Person ( andrepar ) ) 8 INF1010PersonTre. settinn (new INF1010Person ( nikolark ) ) 9 <Se struktur bygget opp så langt på forrige lysark>

Java datastruktur Sette inn det første objektet Vi lager objektet ved å utføre konstruktøren i INF1010Person: 1 new INF1010Person ( kristhk ) Dette objektet gis som parameter til et kall på settinn i BTre-objektet INF1010PersonTre: 1 INF1010PersonTre. settinn (new INF1010Person ( kristhk ) ) ; 2 3 4 public void settinn ( INF1010Person inn ) { 5 if ( rot == null ) rot = inn ; 6 else rot. leggtilbtre ( inn ) ; 7 } Vi får satt rot til å peke på objektet med navn lik kristhk.

Java datastruktur Sette inn det andre objektet Objektet blir laget på samme måte som det første. Men rot er ikke lenger null og vi får et kall på leggtilbtre i objektet som rot peker på. I denne metoden blir «kristhk» sammenlignet med «haavaand». Resultatet blir større enn null og metoden sjekker om venstrepekeren peker til noe. Det gjør det ikke og objektet «haavaand» blir satt inn der. Så gjentas dette for hvert nytt objekt som skal settes inn. Vi starter hver gang i rota (kaller på leggtilbtre), finner ut «hvilken vei vi skall» og kaller på leggtilbtre i riktig subtrerot.

Java datastruktur Innsettingsmetoden er inne i objektet Alle objektene i treet har en metode som kan sette inn innparameterobjektet. Når vi kaller innsettingsmetoden inne i et objekt med personen som som skal settes inn som parameter, vil denne først sjekke om innobjektet skal settes inn til venstre eller til høyre. Deretter settes objektet inn der ved å sette høyre- eller venstrepekeren til å peke på objektet som skal inn, dersom det ikke er noe der fra før. Hvis det er et objekt der fra før sendes parameteren videre ved å kalle på dette objektets settinnmetode.

Java datastruktur Slik sendes parameteren fra metode til metode nedover i treet til vi kommer til en peker som er null. Da settes denne til å peke på innobjektet. 1 public void leggtilbtre ( Object inn ) { 2 int smnlgn = this. sammenlign( inn ) ; 3 if ( smnlgn < 0 ) 4 i f ( henthsubtrepeker ( ) == null ) 5 setthsubtrepeker( inn ) ; 6 else henthsubtrepeker ( ). leggtilbtre ( inn ) ; 7 else 8 i f ( hentvsubtrepeker ( ) == null ) 9 settvsubtrepeker ( inn ) ; 10 else hentvsubtrepeker ( ). leggtilbtre ( inn ) ; 11 }

Java datastruktur Drøft disse spørsmålene Hva gjør settinnmetoden i objektet som blir satt inn? Hvorfor kan vi ikke sette objektet der det er ledig hvis pekeren der det skal ikke er det? Hva skjer hvis vi setter inn to objekter med samme navn?

Gjøre noe i hele treet = kalle på samme metode i alle objektene Gjøre noe i alle objektene For å gjøre en konkret oppgave (sette en variabel til en bestemt verdi) i alle objektene kan vi: Utfør oppgaven i rotobjektet Utfør oppgaven i venstre subtre Utfør oppgaven i høyre subtre Disse tre operasjonene kan vi gjøre i vilkårlig rekkefølge. Oppgaven vil bli gjort i alle objektene, men i forskjellig rekkefølge.

Gjøre noe i hele treet = kalle på samme metode i alle objektene Skrive ut alle objektene I personklassen: 1 void skrivut ( ) { 2 BTelem p = hentvsubtrepeker ( ) ; 3 if (p!= null ) p. skrivut ( ) ; 4 5 System. out. print (hentnavn ()+ ) ; 6 7 if (henthsubtrepeker ( )!= null ) 8 henthsubtrepeker ( ). skrivut ( ) ; 9 }

Idé Bruk av indre klasser I dette eksemplet er ideen at vi bruker indre klasser til strukturelementene. (Både for binærtre- og og listeobjektene). Fra strukturelementene går det en peker (generisk (T) eller generell (Object)) til dataobjektet. Med en slik organisering av dataene, er det naturlig å tegne objekter av den indre klassen inne i et objekt av den ytre klassen.

Java datastruktur toppelement rot ListeNode skrivut tilstakk leggtilbtre skrivut BTreNode C lifo Objekter av klassen Bil frabtretilstakk BTre

Klassestruktur Klassestruktur 1 interface Skrivbar { } 2 3 class BTre <T extends Skrivbar & Comparable <T>> { 4 BTreNode rot ; 5 class BTreNode { } 6 } 7 class Stakk { 8 ListeNode toppelement ; 9 class ListeNode { } 10 } 11 class B i l implements Comparable <Bil >, Skrivbar { } 12 13 public class TreStakkEksempel{ 14 BTre <Bil > biltre = new BTre <Bil >(); 15 Stakk lifo = new Stakk ( ) ; 16 }

Klassestruktur Rollen Skrivbar og klassen BTre 1 interface Skrivbar { 2 void skrivut ( ) ; 3 } 4 class BTre <T extends Skrivbar & Comparable <T>> { 5 BTreNode rot ; 6 void leggtilbtre (T t ) { } 7 void skrivut ( ) { } 8 void frabtretilstakk ( Stakk liste ) { } 9 10 class BTreNode { 11 BTreNode venstre, høyre ; 12 T denne; 13 BTreNode(T t ) { denne = t ; } 14 void leggtilbtre ( BTreNode inn ) { } 15 void frabtretilstakk ( Stakk liste ) { } 16 void skrivut ( ) { } 17 18 }

Klassestruktur Listeklassen 1 class Stakk { 2 ListeNode toppelement ; 3 4 class ListeNode { } 5 6 void skrivut ( ) { } 7 8 void tilstakk ( Object o ) { } 9 }

Klassestruktur Klassen som beskriver selve dataobjektet (Bil) 1 class B i l implements Comparable <Bil >, Skrivbar { 2 private String navn; 3 Bil ( String n) { navn = n; } 4 5 public int compareto( Bil b) { 6 return navn.comparetoignorecase (b.navn ) ; 7 } 8 10 9 String hentnavn ( ) { return navn; } 11 public void skrivut ( ) { } 12 }

Klassestruktur Klassen som beskriver eksemplet (main) 1 public class TreStakkEksempel{ 2 public static void main( String [ ] args ) { 3 BTre <Bil > biltre = new BTre <Bil >(); 4 5 Stakk lifo = new Stakk ( ) ; 6 7 biltre. leggtilbtre (new Bil ( kristhk ) ) ; 8 // <.... mange utelatt > 9 biltre. skrivut ( ) ; 10 System. out. println( ========== ) ; 11 biltre. frabtretilstakk ( lifo ) ; 12 lifo. skrivut ( ) ; 13 } 14 }

Klassestruktur Metoden som legger et objekt til LIFO-lista 1 class Stakk { 2 ListeNode toppelement ; 3 4 class ListeNode { 5 ListeNode neste ; Object denne; 6 ListeNode( Object objekt ) {denne = objekt ; } 7 } 8 9 void tilstakk ( Object o ) { 10 ListeNode ln = new ListeNode(o ) ; 11 ln. neste = toppelement ; 12 toppelement = ln ; 13 } 14 }

Klassestruktur Metodene som gjør om fra binærtre til liste 1 class BTre <T extends Skrivbar & Comparable <T>> { 2 BTreNode rot ; 3 void frabtretilstakk ( Stakk liste ) 4 { if ( rot!= null ) rot. frabtretilstakk ( liste ) ; } 5 6 class BTreNode { 7 BTreNode venstre, høyre ; 8 T denne; 9 BTreNode(T t ) { denne = t ; } 10 11 void frabtretilstakk ( Stakk liste ) { 12 if ( venstre!= null ) venstre. frabtretilstakk ( liste ) ; 13 liste. tilstakk (denne) ; 14 if (høyre!= null ) høyre. frabtretilstakk ( liste ) ; 15 } 16 } 17 }