Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2



Like dokumenter
Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Algoritmer og datastrukturer Kapittel 9 Delkapittel 9.2

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.4

G høgskolen i oslo. Emne: Algoritmer og datastrukturer. Emnekode: 80131A. Faglig veileder: UlfUttersrud. Gruppe(r) : Dato:

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Eksamen 22. februar 2011

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

Algoritmer og datastrukturer Kapittel 5 - Delkapittel 5.1

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.3

Algoritmer og datastrukturer Kapittel 2 - Delkapittel 2.1

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

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer A.1 Filbehandling på bit-nivå

EKSAMEN med løsningsforslag

Algoritmer og datastrukturer Eksamen

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

Algoritmer og datastrukturer Assignment 11 Side 1 av 5

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Kapittel 5 - Delkapittel 5.4

Emnekode: I-Dato: I ~ Antall oppgaver: I I Aiie -sk:i=rftlige - bme trykte og håndskrevne, samt alle typer

~ta11 oppgaver: 4. Nle skriftlige hjelpemidler-både trykte og håndskrevne, er tillatt

Et eksempel: Åtterspillet

Algoritmer og Datastrukturer

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

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

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Løsningsforslag

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

UNIVERSITETET I OSLO

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

Løsningsforslag EKSAMEN

INF2220: Forelesning 2

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)

INF2220: Forelesning 2

Ordliste. Obligatorisk oppgave 1 - Inf 1020

Definisjon: Et sortert tre

Norges Informasjonsteknologiske Høgskole

EKSAMEN. Algoritmer og datastrukturer

Oppgave 1. Oppgave 2. Høgskolen i Østfold Avdeling for informasjonsteknologi

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

UNIVERSITETET I OSLO

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Definisjon av binært søketre

Algoritmer og datastrukturer Kapittel 2 - Delkapittel 2.2

TOD063 Datastrukturer og algoritmer

Utførelse av programmer, metoder og synlighet av variabler i JSP

Lars Vidar Magnusson

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

Algoritmer og datastrukturer Binære søketrær

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.4

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Flerveis søketrær og B-trær

INF1010 Binære søketrær ++

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

Diagnosekart for oblig 2, INF3/4130 h07

Soloball. Steg 1: En roterende katt. Sjekkliste. Test prosjektet. Introduksjon. Vi begynner med å se på hvordan vi kan få kattefiguren til å rotere.

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

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

Kanter, kanter, mange mangekanter

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

Bruk av oppgaver og grupper i

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

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

Straffespark Introduksjon Scratch Lærerveiledning

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Algoritmer og datastrukturer Vedlegg A.2 BitOutputStream

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Rekursiv programmering

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

Tallinjen FRA A TIL Å

UNIVERSITETET I OSLO

Kap.12. Flervegssøketre. Studerer 2-3 og 2-4 trær. Sist oppdatert

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

Balanserte binære søketrær

Korteste vei i en vektet graf uten negative kanter

Skilpaddefraktaler Erfaren Python PDF

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

UNIVERSITETET I OSLO

Algoritmeanalyse. (og litt om datastrukturer)

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

Object [] element. array. int [] tall

Algoritmer og Datastrukturer IAI 21899

UNIVERSITETET I OSLO

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2014

OPPGAVE 5b og 8b Java Kode

Rekursjon. Binærsøk. Hanois tårn.

Algoritmer og datastrukturer A.1 BitInputStream

Lars Vidar Magnusson Kapittel 13 Rød-Svarte (Red-Black) trær Rotasjoner Insetting Sletting

Binære trær: Noen algoritmer og anvendelser

Løse reelle problemer

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

Transkript:

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 1 av 16 Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2 9.2 Rød-svarte og 2-3-4 trær 9.2.1 B-tre av orden 4 eller 2-3-4 tre Et rød-svart tre og et B-tre av orden 4 er to forskjellige måter å oppfatte samme datastruktur. Et B-tre er ikke et binærtre. Det er et balansert tre der nodene kan ha flere enn to barn. I et binærtre kan en node ha maksimalt to barn. I et B-tre av orden m kan en node ha maksimalt m barn. Vi skal se på generelle B-trær i et senere avsnitt. Et B-tre av orden 4 kalles et 2-3-4 tre siden en node kan ha 2, 3 eller 4 barn. Der gjelder: En node kan ha 1, 2 eller 3 verdier. En indre node har 2, 3 eller 4 barn. Antallet verdier i en indre node er alltid én mindre enn antallet barn som noden har. Alle bladnoder ligger på samme nivå i treet. Det tillates ikke duplikatverdier. Figur 9.2.1 a) : Et 2-3-4 tre Figur 9.2.1 a) viser et 2-3-4 tre. Treet har 8 noder, 3 indre noder (rotnoden og to til) og 5 bladnoder. I et 2-3-4 tre er antallet verdier i en indre node alltid én mindre enn antallet barn som noden har. Vi ser på figuren at rotnoden har én verdi og dermed to barn. Rotnodens venstre barn har to verdier og tre barn, mens rotnodens høyre barn er én verdi og to barn. Sorteringsorden Verdiene i en node skal ligge i stigende sortert rekkefølge. I slike trær kan vi imidlertid ikke som for binære trær, snakke om venstre og høyre barn siden det kan være 2, 3 eller 4 barn. Men vi kan for enhver verdi inne i en indre node snakke om denne verdiens venstre og høyre barn. Vi ser på noden som inneholder verdiene 7 og 10 i Figur 9.2.1 a): Vi kan si at verdien 7 har to barn - det venstre barnet er noden med verdiene 3 og 5 og det høyre barnet er noden med verdien 9. På samme måte har verdien 10 to barn - det venstre er noden med verdien 9 og det høyre noden med verdiene 11 og 12. Dette betyr spesielt at noden med verdien 9 er høyre barn til verdien 7 og venstre barn til naboverdien 10. Sorteringsrekkefølgen for verdiene i et 2-3-4 tre blir dermed slik: Verdiene i hver node skal være sortert stigende. Hvis x er en vilkårlig verdi i en indre node, så skal største verdi i det venstre barnet til x være mindre enn x, og x skal være mindre enn den minste verdien i høyre barn til x. Oppgaver til avsnitt 9.2.1 1. Bruk søkeordet 2-3-4 tree på internett. Hva sier Wikipedia? Prøv så ordet B-tree.

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 2 av 16 9.2.2 Innlegging og søking i et 2-3-4 tre Gitt verdiene 18, 10, 25, 7, 5, 12, 11, 22, 9, 3, 15, 13, 16 og 30. Vi skal legge disse verdiene fortløpende inn i et 2-3-4 tre. Vi starter med et tomt tre. Dermed må første verdi 18 legges i en rotnode. Det gir flg. figur: Figur 9.2.2 a) : Rotnoden har verdien 18 Rotnoden har plass til tre verdier. De to neste (10 og 25) legges inn på rett sortert plass: Figur 9.2.2 b) : Rotnoden har verdiene 10, 18, 25 Den neste verdien 7 er det imidlertid ikke plass til. Først setter vi 7 sammen med de tre verdiene og får i sortert rekkefølge 7, 10, 18, 25. Deretter deler vi noden i to noder. Den første av de to nodene skal inneholde de to første verdiene, dvs. 7 og 10. Den andre noden skal inneholde den siste (fjerde) verdien, dvs. 25. Den tredje verdien, dvs. 18, skal legges i en ny rotnode og denne skal få de to nodene som barn. Tilsammen slik: Figur 9.2.2 c) : En rotnode og to bladnoder Verdien 5 hører hjemme i venstre bladnode og siden det er plass kan den legges rett inn: Figur 9.2.2 d) : Den ene bladnoden er nå full Verdien 12 hører sorteringsmessig hjemme i bladnoden som er full. Da må vi gjøre som sist. Vi setter først 12 sammen med de andre verdiene og får i sortert rekkefølge 5, 7, 10, 12, Noden deles så i to noder. I den første legger vi 5 og 7, i den andre 12. Den tredje verdien, dvs. 10, skal flyttes opp til foreldernoden og plasseres på rett sortert plass der. De to nodene blir deretter venstre og høyre barn til verdien 10: Figur 9.2.2 e) : Verdien 12 er lagt inn Det er plass i bladnodene til både 11, 22 og 9. De kan settes rett inn: Figur 9.2.2 f) : Verdien 11, 22 og 9 er lagt inn Så kommer verdien 3. Den hører hjemme i bladnoden med verdiene 5, 7 og 9, men der er det fullt. Vi setter 3 sammen med de andre og får 3, 5, 7, 9. Noden deles i to. I den første legger

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 3 av 16 vi 3 og 5 og i den andre 9. Den tredje verdien, dvs. 7 flyttes opp til foreldernoden og legges på rett sortert plass der. De to nodene blir venstre og høyre barn til 7: Figur 9.2.2 g) : Verdien 3 er lagt inn Verdien 15 hører hjemme i bladnoden med verdiene 11 og 12. Der er det ledig plass: Figur 9.2.2 h) : Verdien 15 er lagt inn Så kommer 13. Den skal inn i noden som fra før har verdiene 11, 12, 15. Vi setter 13 sammen med dem og får i sortert rekkefølge 11, 12, 13, 15. Som før deler vi noden i to. I den første legger vi 11 og 12 og i den andre legger vi 15. Den tredje verdien, dvs. 13, skal flyttes opp til foreldernoden. Men foreldernoden er også full. Da må den deles i to noder. I sortert rekkefølge får vi da i foreldernoden verdiene 7, 10, 13, 18. De to første (7 og 10) legges etter oppdelingen i den første noden, den siste verdien (18) i den andre noden og den tredje verdien (13) flyttes opp og legges i en ny rotnode: Figur 9.2.2 i) : Treet har fått et nytt nivå Nå er det bare 16 og 30 igjen. De tilhørende bladnodene har plass. Det gir flg. tre: Figur 9.2.2 j) : Alle verdiene er satt inn Nodene kan også tegnes som tre små bokser («rektangulære» noder). Hvis noden har kun én verdi brukes første boks og med kun to verdier de to første boksene. Da blir treet slik: Figur 9.2.2 k) : Nodene består av tre små bokser Algoritme for innlegging Eksemplet over gir flg. algoritme for innlegging av verdier: 1. Finn bladnoden som verdien hører til ut fra sorteringen. Hvis den ikke er full, legg verdien inn på rett sortert plass i noden.

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 4 av 16 2. Hvis noden er full, sett først opp de fire (de tre gamle og den nye) verdiene sortert. Del noden i to. Legg de to første verdiene i første node og den siste (fjerde) verdien i andre node. Flytt den tredje verdien opp på rett sortert plass i foreldernoden hvis det finnes en foreldernode og den ikke allerede er full. De to nodene blir venstre og høyre barn til verdien. 3. Hvis det ikke er noen foreldernode, lag en ny node som da blir rotnode. Legg verdien der. Gå ellers til punkt 2) hvis det finnes en foreldernode og den er full. Algoritmen over vil alltid sørge for at det blir et korrekt 2-3-4 tre. Men et slikt tre er ikke entydig. Det kan lages flere 2-3-4 trær med de samme verdiene. Ta verdiene 2, 3 og 4 som eksempel. Det finnes to forskjellige 2-3-4 trær som begge inneholder disse tre verdiene. Det er disse to trærne: Figur 9.2.2 l) : To trær som begge inneholder 2, 3 og 4 Kravet til et 2-3-4 tre er at ingen noder har flere enn tre verdier og dermed ikke flere enn fire barn, og at at alle bladnodene ligger på samme nivå. Begge trærne i Figur 9.2.2 l) oppfyller det kravet. Det er imidlertid ønskelig at nodene i et 2-3-4 tre er så fulle med verdier som mulig. Da får man normalt et mer effektivt tre. Det finnes flere forskjellige innleggingsalgoritmer, men alle lager 2-3-4 trær av samme type. Problemet dukker først og fremst opp når verdier skal fjernes. Da vil det kunne bli mange noder med kun én verdi. Det finnes derfor mange algoritmer for fjerning. Alle fører til korrekte 2-3-4 trær. Men noen av algoritmene er mer omhyggelige enn andre med å sørge for at det ikke blir for mange noder med enslige verdier. Fjerning er generelt mer komplisert enn innlegging. Søking i et 2-3-4 tre er rett frem. Det er bare å bruke sorteringsrekkefølgen. Start i rotnoden og gå eventuelt videre til et barn basert på størrelsen på søkeverdien i forhold til nodeverdiene. Hvis en kommer til en bladnode og skal videre, er ikke verdien i treet. Oppgaver til avsnitt 9.2.2 1. Sett først inn 14, så 17 og så 31 i treet i Figur 9.2.2 k) eller Figur 9.2.2 j). 2. I starten av dette avsnittet er det satt opp en samling verdier og et 2-3-4 tre blir bygget ved at verdiene legges inn. Bygg opp det samme treet ved hjelp av B-tre appletten. Bruk B-tre av orden 4 (se innstillingen øverst og nederst på appletten). Sett også inn verdiene i Oppgave 1. 3. Sett inn verdiene 12, 7, 3, 16, 20, 14, 5, 19, 10, 17, 11, 2, 18, 1, 13, 9, 15, 8, 4, 6 (i den rekkefølgen) i et på forhånd tomt 2-3-4 tre. Gjør det først for hånd. Du får en fasit ved å bruke appletten fra Oppgave 2. Eller du kan eventuelt gjøre det på papir parallelt med at du bruker en applett. Papir først og så appletten. 4. Gjør som i Oppgave 3, men bruke verdiene 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13.

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 5 av 16 9.2.3 Fjerning av verdier i et 2-3-4 tre Når en verdi skal fjernes må vi først finne den noden som inneholder verdien. Da er det to muligheter: 1) Den ligger i en indre node eller 2) den ligger i en bladnode. 1) Den ligger i en indre node: Ta treet under som eksempel. 13 skal fjernes. Se den rød pilen: Figur 9.2.3 a) : Verdien 13 skal fjernes Vi finner først den som kommer etter 13 i sortert rekkefølge. Det er 15. Som vi ser ligger den lengst til venstre i en bladnode. La disse bytte plass. Da får vi treet: Figur 9.2.3 b) : Verdiene 13 og 15 har byttet plass. Verdien 13 som skal fjernes, ligger nå i en bladnode. Med andre ord holder det å lage en regel (algoritme) for å fjerne verdier i bladnoder. 2) Verdien som skal fjernes ligger i en bladnode: Hvis det ikke er den enste verdien i bladnoden, fjerner vi verdien direkte. Hvis nodene i treet er tegnet som tre små bokser, må vi eventuelt flytte på den eller de gjenværende verdiene i noden slik at boksene er fylt opp fra venstre. Hvis vi fjerner 13 i treet i Figur 9.2.2 m), blir det slik: Figur 9.2.3 c) : Verdiene 13 er fjernet fra treet. eller slik hvis vi tegner treet med «runde» noder: Figur 9.2.3 d) : Verdiene 13 er fjernet fra treet. Da får vi flg. generelle regel: Hvis verdien som skal fjernes ligger i en bladnode og noden inneholder to eller tre verdier, så kan verdien fjernes uten videre.

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 6 av 16 Hvis den verdien som skal fjernes er en enslig verdi i en bladnode, kan vi «låne». Hvis en av de to nærmeste søskennodene har to eller flere verdier, kan vi først flytte ned disse to nodenes felles forelderveri og så flytte den næremste søskenverdien opp til forledernoden. Ta utgangspunkt i treet i Figur 9.2.3 c). Verdien 16 er enslig verdi. Da kan vi fjerne 16, flytte 18 ned og 22 opp. Det gir dette treet: Figur 9.2.3 e) : Verdiene 16 er fjernet fra treet. Neste problem oppstår hvis vi skal slette en enslig verdi i en bladnode og det ikke er noen søskennoder å «låne» av. Da blir det mer komplisert. Anta at verdien 3 er fjernet i treet i Figur 9.2.3 e), dvs. treet ser slik ut: Figur 9.2.3 f) : Verdiene 3 er fjernet fra treet. Hvis vi skal slette 5 i treet i Figur 9.2.3 f) får en situasjon der det ikke er noen søskennode å «låne» fra. Ta slår vi sammen verdien (5), søskenverdien (9) og de to verdienes felles forelderverdi (7) til én node, dvs. slik: Figur 9.2.3 g) : Verdiene 5 er fjernet fra treet. Oppgaver til avsnitt 9.2.3 1. xxxx

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 7 av 16 9.2.4 Fra 2-3-4 tre til rød-svart tre I et rød/svart tre har nodene to farger. I et vanlig binærtre vil venstre og/eller høyre peker i en node kunne være null. Her skal vi isteden si at den peker til en svart «nullnode». Et rød-svart tre er definert på følgende måte: 1. Et rød-svart tre er et binært søketre. 2. Nodene er enten røde eller svarte. Rotnoden er svart. 3. Barna til en rød node er svarte. 4. Pekere som i et vanlig tre peker til null, skal her isteden peke til en svart «nullnode». 5. Antall svarte noder på veien fra en nullnode og opp til roten er det samme uansett hvilken nullnode en starter i. Et 2-3-4 tre og et rød-svart tre er to sider av samme sak. Et 2-3-4 tre kan «oversettes» til et rød-svart tre. «Oversettelsen» skjer ved hjelp av flg. «omregningsformler»: Figur 9.2.4 a): «Omregning» fra 2-3-4 tre til rød-svart tre Vi starter med 2-3-4 treet i Figur 9.2.4 b) under. Det kan oversettes til det rød/svarte treet nedenfor ved at vi bruker en «omregningsformel» for hver node fra rotnoden og nedover: Figur 9.2.4 b) : Et 2-3-4 tre Figur 9.2.4 c) : Et rød-svart tre

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 8 av 16 I det rød-svarte treet Figur 9.2.4 c) er en «nullnode» markert med en liten svart runding. Vi kan sjekke om kravene til et rød-svart tre er oppfylt. 1) Det er et binært søketre. 2) Rotnoden er svart og de andre nodene er enten svarte eller røde. 3) Ingen rød node har et rødt barn. 4) Alle «nullnodene» er satt på. 5) Vi ser at hvis vi starter i en «nullnode» og går oppover mot roten, er det samme antall svarte noder på veien uansett hvilken «nullnode» vi starter i. Algoritmen for å «oversette» et 2-3-4 tre til et rød-svart tre er ikke entydig. Formel 2 sier at vi kan omskape en 2-3-4 node med to verdier til to noder der enten (2a) første verdi legges i en svart foreldernode og den andre verdien i et rødt høyrebarn eller (2b) at første verdi legges i et rødt venstrebarn og den andre verdien i en svart forelder. Treet Figur 9.2.4 c) ble til ved at Formel 2a) ble brukt i alle tilfellene. Utseendet til det rød-svarte treet vil derfor bli forskjellig avhengig av hvilken av disse to måtene vi velger eller om vi blander dem. Men treet blir uansett et korrekt rød-svart tre. Oppgaver til avsnitt 9.2.4 1. Ta utgangspunkt i 2-3-4 treet i Figur 9.2.4 b). Tegn det rød-svarte treet du får når du hele tiden bruker Formel 2b) når en node med to verdier «oversettes». 2. «Oversett» flg. 2-3-4 tre til et rød-svart tre: 3. «Oversett» flg. 2-3-4 tre til et rød-svart tre: 9.2.5 Innlegging i et rød-svart tre Treets første verdi legges i en svart rotnode En verdi som skal legges inn i et ikke-tomt tre, legges inn ved hjelp av en «fra bunnen og opp»-teknikk (eng: bottom up). Først legges verdien på rett sortert plass i en rød node. Hvis dens forelder er svart, er vi ferdig. Hvis derimot foreldren er rød, må noe gjøres på grunn av pkt. 3 i definisjonen av et rød/svart tre. Situasjonen med at både forelder og barn er røde kan fremkomme på mange ulike måter. For å få færre slike tilfeller defineres det at en null-peker i en node isteden skal peke på en svart nullnode. Hvis både barn og forelder er røde, kan ikke foreldren være rotnoden siden rotnoden alltid er svart. Dermed må det finnes en besteforelder og den må være svart. Hvis besteforelder ikke var svart, ville vi hatt et tre der forelder og besteforelder begge er røde. Det er umulig på grunn av pkt. 3. Det er ikke sikkert at foreldren har et søsken på vanlig måte, men ved hjelp teknikken med nullnoder kan vi si at enhver node (bortsett fra roten) har et søsken.

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 9 av 16 Figur 9.5.2 a): Rød-svarte trær der en rød node har rødt barn Vi setter navnet X på den nederste noden, F på dens forelder, B på dens besteforelder og S som navn på forelders søsken. Figur 9.5.2 a) viser fire tilfeller der det er en nullnode som er søsken S til F. Generelt får vi to hovedtilfeller. Tilfelle I) er at S er svart og tilfelle II) at S er rød. I begge tilfellene får vi fire undertilfeller. I tilfellet I) kaller vi de fire undertilfellene 1a), 1b), 2a) og 2b). I tilfellet II) kaller vi dem 3a), 3b), 4a) og 4b). I tilfellet I) må vi både rotere og skifte marger, mens det i tilfellet II) holder å skifte farger. Nedenfor står en oppskrift for hvert av de åtte tilfellene: Hovdetilfellet I) - F er rød og S er svart Tilfellet 1a) I figuren lengst til venstre er F rød og S svart. Dette reparerer vi ved å gjøre en enkel høyrerotasjon (F opp og B ned) og et fargeskifte - F til svart og B til rød. Resultatet blir som i den høyre av de to figurene. Tilfellet 1b) I figuren lengst til venstre er F rød og S svart. Det reparerer vi ved å gjøre en enkel venstrerotasjon (F opp og B ned) og et fargeskifte - F til svart og B til rød. Resultatet blir som i den høyre av de to figurene. Tilfellet 2a) I figuren lengst til venstre er F rød og S svart. Det reparerer vi ved å gjøre en dobbel høyrerotasjon (X opp og B ned) og et fargeskifte - X til svart og B til rød. Resultatet blir som i den høyre av de to figurene.

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 10 av 16 Tilfellet 2b) I figuren lengst til venstre er F rød og S svart. Det reparerer vi ved å gjøre en dobbel venstrerotasjon (X opp og B ned) og et fargeskifte - X til svart og B til rød. Resultatet blir som i den høyre av de to figurene. Hovdetilfellet II) - F er rød og S er rød Tilfellet 3a) I figuren lengst til venstre er både F og S røde. Det reparerer vi ved å skifte farge på både F og S fra rød til svart, og å skifte farge på B fra svart til rød. Resultatet blir som i den høyre av de to figurene. Hvis B er roten, settes den tilbake til svart og hvis ikke, ser vi på forelder til B osv. Tilfellet 3b) I figuren lengst til venstre er både F og S røde. Det reparerer vi ved å skifte farge på både F og S fra rød til svart, og å skifte farge på B fra svart til rød. Resultatet blir som i den høyre av de to figurene. Hvis B er roten, settes den tilbake til svart og hvis ikke, ser vi på forelder til B osv. Tilfellet 4a) I figuren lengst til venstre er både F og S røde. Det reparerer vi ved å skifte farge på både F og S fra rød til svart, og å skifte farge på B fra svart til rød. Resultatet blir som i den høyre av de to figurene. Hvis B er roten, settes den tilbake til svart og hvis ikke, ser vi på forelder til B osv. Tilfellet 4b) I figuren lengst til venstre er både F og S røde. Det reparerer vi ved å skifte farge på både F og S fra rød til svart, og å skifte farge på B fra svart til rød. Resultatet blir som i den høyre av de to figurene. Hvis B er roten, settes den tilbake til svart og hvis ikke, ser vi på forelder til B osv.

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 11 av 16 «Fra bunnen og opp»-algoritme for innlegging. Husk at hvis en node mangler et barn, tenker vi oss isteden at det er en nullnode som er barnet. 1. Treets første verdi legges i en svart rotnode. 2. Generelt legges en ny verdi i en rød node på rett sortert plass i treet. La den hete X. 3. Hvis forelder F til X er svart, stopper vi. Hvis F er rød, må F ha en svart forelder B (beste-forelder til X) og F et søsken S (der S kan være en svart nullnode). 4. Hvis F sitt søsken S er svart, må det utføres en enkel eller en dobbel rotasjon (høyre eller venstre) og deretter et fargeskifte (F til svart og B til rød). Dermed kan vi stoppe. 5. Hvis F sitt søsken S er rød, må det utføres et fargeskifte (F og S til svart og B til rød). Hvis B er roten, settes den tilbake til svart og vi kan stoppe. Hvis ikke, omdøper vi B til X og går tilbake til pkt. 3. Oppgaver til avsnitt 9.2.5 1. Eksperimenter med appletten Red/Black Tree Demonstration. a. Sett inn tallene 8, 7, 6, 5, 4, 3, 2, 1 (i den oppgitte rekkefølgen) i et på forhånd tomt rød/svart tre. Tegn treet etter hver innsetting. Bruk appleten parallelt. Dvs. tegn først og sett så inn i appletten og sjekk at du får samme resultet. b. Gjør som i a), men bruk tallene 10, 4, 7, 13, 11, 6, 8, 9. c. Gjør som i a), men bruk tallene 15, 18, 17, 3, 6, 10, 12, 13, 14. d. Gjør som i a), men bruk tallene 7, 5, 13, 9, 10, 12, 11, 6, 14. 2. Gjør som i Oppgave 1, men bruk Data Structure Visualizations. 3. Gjør som i Oppgave 1, men bruk denne appletten.

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 12 av 16 9.2.6 Java-kode for et rød-svart tre Siden et rød-svart tre er et binært søketre, blir nodeklassen som før bortsett fra at nå skal nodene også ha en farge. Vi innfører derfor to fargekonstanter med navn SVART og RØD. Vi trenger også «nullnoder». I realiteten lager vi kun én nullnode som alle da kan peke til. Den noden får navnet NULL og settes opp som en konstant i klassen. Vi kaller klassen RSBinTre der R står for rød og S for svart: import java.util.*; public class RSBinTre<T> implements Beholder<T> private static final boolean SVART = true; private static final boolean RØD = false; private static final class Node<T> // en indre nodeklasse private T verdi; // nodens verdi private Node<T> venstre; // peker til venstre barn private Node<T> høyre; // peker til høyre barn private boolean farge; // RØD eller SVART // konstruktør private Node(T verdi, Node<T> v, Node<T> h, boolean farge) this.verdi = verdi; venstre = v; høyre = h; this.farge = farge; // slutt på class Node private final Node<T> NULL; private Node<T> rot; private int antall; private Comparator<? super T> comp; // en svart nullnode // treets rot // antall verdier // treets komparator public RSBinTre(Comparator<? super T> comp) // konstruktør rot = NULL = new Node<>(null,null,null,SVART); this.comp = comp; // en konstruksjonsmetode public static <T extends Comparable<? super T>> RSBinTre<T> lagtre() return new RSBinTre<>(Komparator.<T>naturlig()); // Instansmetodene skal inn her // slutt på class RSBinTre Programkode 9.2.6 a)

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 13 av 16 Flere av metodene fra klassen SBinTre kan brukes i klassen RSBinTre. Men pga. nullnoden NULL må vi gjøre noen små endringer. F.eks. slik i metoden inneholder(t verdi): public boolean inneholder(t verdi) for (Node<T> p = rot; p!= NULL; ) int cmp = comp.compare(verdi,p.verdi); if (cmp > 0) p = p.høyre; else if (cmp < 0) p = p.venstre; else return true; // funnet return false; // ikke funnet Programkode 9.2.6 b) Utfordringen ligger i metoden legginn(). Vi legger inn som i et vanlig binært søketre, men hvis treet må «repareres» etterpå, må vi kunne gå oppover. Det kan vi løse ved hjelp av en stakk. Alle nodene på veien nedover legges på stakken. Metoden starter derfor slik: public boolean legginn(t verdi) if (rot == NULL) // treet er tomt rot = new Node<>(verdi,NULL,NULL,SVART); // roten skal være svart antall++; return true; // vellykket innlegging Stakk<Node<T>> stakk = new TabellStakk<>(); // en stakk Node<T> p = rot; // hjelpevariabel int cmp = 0; // hjelpevariabel while (p!= NULL) stakk.legginn(p); // legger p på stakken cmp = comp.compare(verdi,p.verdi); // sammenligner if (cmp < 0) p = p.venstre; else if (cmp > 0) p = p.høyre; else return false; // til venstre // til høyre // duplikater ikke tillatt Node<T> x = new Node<>(verdi,NULL,NULL,RØD); // en rød node antall++; Node<T> f = stakk.taut(); if (cmp < 0) f.venstre = x; else f.høyre = x; // forelder til x // x blir venstre barn // x blir høyre barn if (f.farge == SVART) return true; // vellykket innlegging // Men hva hvis f er RØD? Programkode 9.2.6 c)

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 14 av 16 Så langt er Programkode 9.2.6 c) omtrent som for et vanlig binærtre. Det nye er å behandle situasjonen der x sin forelder f er rød. I så fall kan den ikke være rotnoden. Vi starter derfor med å hente forelderen b til f (dvs. besteforelderen til x) fra stakken. Deretter starter en while-løkke. I den finner vi først søskennoden s til f og så om s er et venstre eller et høyre barn. Hvis s er svart, får vi hovedtilfellet I) og hvis s er rød, hovedtilfellet II) i illustrasjonene: Node<T> b = stakk.taut(); // b for besteforelder while (true) Node<T> s = (f == b.venstre)? b.høyre : b.venstre; if (s.farge == SVART) // Rotasjoner og fargeskifte else // s.farge == RØD // Fargeskifte // while Programkode 9.2.6 d) Hvis s.farge er SVART har vi fire undertilfeller - se illustrasjonene. I hver av dem inngår en rotasjon - enten en enkel eller en dobbel. Vi trenger derfor flg. fire rotasjonsmetoder: private static <T> Node<T> EHR(Node<T> p) // Enkel høyrerotasjon Node<T> q = p.venstre; p.venstre = q.høyre; q.høyre = p; return q; private static <T> Node<T> EVR(Node<T> p) // Enkel venstrerotasjon Node<T> q = p.høyre; p.høyre = q.venstre; q.venstre = p; return q; private static <T> Node<T> DHR(Node<T> p) // Dobbel høyrerotasjon Node<T> q = p.venstre; Node<T> r = q.høyre; q.høyre = r.venstre; r.venstre = q; p.venstre = r.høyre; r.høyre = p; return r;

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 15 av 16 private static <T> Node<T> DVR(Node<T> p) // Dobbel venstrerotasjon Node<T> q = p.høyre; Node<T> r = q.venstre; q.venstre = r.høyre; r.høyre = q; p.høyre = r.venstre; r.venstre = p; return r; Programkode 9.2.6 e) De fire tilfellene 1a), 1b), 2a) og 2b) fra illustrasjonene må behandles hver for seg. For å finne hvem av dem som er aktuelle, må vi undersøke om x er venstre eller høyre barn til f og om f er venstre eller høyre barn til b. I alle tilfellene skal b bli rød. Det gir flg. kode: if (s.farge == SVART) b.farge = RØD; if (x == f.venstre) // 1a) eller 2b) if (f == b.venstre) // 1a) p = EHR(b); f.farge = SVART; // enkel høyre + fargeskifte else // x == f.høyre // 2b) p = DVR(b); x.farge = SVART; // dobbel venstre + fargeskifte else // x == f.høyre // 1b) eller 2a) if (f == b.venstre) // 2a) p = DHR(b); x.farge = SVART; // dobbel høyre + fargeskifte else // f == b.høyre // 1b) p = EVR(b); f.farge = SVART; // enkel venstre + fargeskifte if (b == rot) rot = p; // hvis b var rotnoden, må roten oppdateres else Node<T> q = stakk.taut(); if (b == q.venstre) q.venstre = p; else q.høyre = p; return true; // to røde noder på rad er nå avverget Programkode 9.2.6 f)

Delkapittel 9.2 Rød-svarte og 2-3-4 trær Side 16 av 16 I tilfellet s.farge er RØD har vi også fire undertilfeller - se illustrasjonene. Men denne gangen trengs det kun å skifte farger: else // s.farge == RØD f.farge = s.farge = SVART; if (b == rot) return true; b.farge = RØD; // f og s blir svarte // vi stopper // b blir RØD // Må sjekke om forelder til b (dvs. oldeforelder til x) er rød Node<T> o = stakk.taut(); // oldeforelder til x if (o.farge == SVART) return true; // vi stopper // nå har den røde noden b en rød forelder // vi omdøper x, f og b og fortsetter oppover x = b; f = o; b = stakk.taut(); // else Programkode 9.2.6 g) Vi kan sette sammen alt dette til en fullstendig kode for metoden legginn(). Dette og kode for en del andre aktuelle metoder ligger på RSBinTre. Hvis du flytter hele klassen over til deg selv, vil du kunne kjøre flg. programbit: int[] a = Tabell.randPerm(10); RSBinTre<Integer> tre = RSBinTre.lagTre(); for (int k : a) tre.legginn(k); System.out.println(tre); // bruker tostring metoden for (int k : tre) System.out.print(k + " "); // bruker iteratoren tre.nullstill(); for (int k = 1; k <= 1_000_000; k++) tre.legginn(k); System.out.println("\n" + tre.høyde()); // treets høyde Programkode 9.2.6 h) Oppgaver til avsnitt 9.2.6 1. Legg inn RSBinTre hos deg og kjør Programkode 9.2.6 h). Copyright Ulf Uttersrud, 2013. All rights reserved.