Intermezzo: Queries op zoekbomen Datastructuren
Queries: hoe op te lossen We hebben: – Een zoekboom (gewoon, rood-zwart, AVL,…) – Een vraag / querie Hoe maken we een methode die die vraag efficient beantwoordt?
Uitgangspunten Gestructureerde aanpak Doorlopen van de boom: – Van wortel omlaag – Van blad omhoog – Soms één kant op, soms naar beide kinderen Vergeet stopcriterium niet
Stoppen Bij blad (als je omlaag gaat) Bij wortel (als je omhoog gaat) Andere stopcriteria (afhankelijk van querie) – Bijvoorbeeld: het gezochte resultaat is gevonden Let op randgevallen (bijvoorbeeld: lege boom)
Gestructureerd kijken Kijk bij de knoop waar je bent en beslis wat te doen: – Stoppen – Omhoog – Links omlaag – Rechts omlaag – Naar beide kanten omlaag – Iets in de knoop zelf
Opschrijven Recursief Iteratief
Voorbeeld Gegeven: zoekboom, elke knoop heeft een kleur in {rood, zwart}, verwijzing naar wortel Vraag: voldoen de kleuren aan de eisen van een rood-zwart boom?
Eerste routine Check-Rood-Zwart(node k) – If k == NIL (lege boom) return true – Else If kleur(k) == rood then return false – Else return CRZ2 (k) AND CRZ3(k) Ideeën: – Eis 1: wortel van boom is zwart hoeven we 1 keer te controleren, dus die eerst maar – De twee andere eisen apart controleren is makkelijker – Opletten voor geval van lege boom
Geen twee rode knopen naast elkaar Controleer voor alle rode knopen dat ze geen zwart kind hebben CRZ2(node k) – If k == NIL then return true – If kleur(k) == rood then If (left(k)!= NIL AND kleur(left(k) == rood) then return false If (right(k)!= NIL AND kleur(right(k) == rood) then return false – Return CRZ2(left(k)) AND CRZ2(right(k))
Controleren zwartdiepte Elk pad van wortel omlaag moet zelfde aantal zwarte knopen hebben: Dus we moeten van deelbomen weten: – Klopt ‘t daar? – Wat is de zwartdiepte van de deelboom – Dus: Soms de waarde false Soms een integer Ideetje: neem een integer, en representeer false door -1
CRZ3 CRZ3(node k) If CheckZD(k) == -1 then return false Else return true
CheckZD CheckZD(node k) If k == NIL then return 0; p = CheckZD(left(k)); q = CheckZD(right(k)); If (p==-1 or q==-1) then return -1; if (p != q) then return -1; If (kleur(k) == zwart) then return p+1; Else {geval dat k rood is) return p; klaar
Tijd en correctheid Correct: mondeling toegelicht Tijd: O(n): twee traversies O(n) is ook nodig want je moet alles in de boom bekijken