Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 11 / 15 Dvejetainiai medžiai ir BST ~50 min
Kodas

bst.go — karkasas

Sukurk bst.go. Kaip įprasta nuo septintos pamokos — paketas, tipai, parašai ir sutartys komentaruose; kūnai tavo.

Ką verta pasižymėti:

  • Put su jau esamu raktu PAKEIČIA įrašą. Lygiai kaip dešimtoje pamokoje: abi struktūros duoda tą patį pažadą apie raktus ir skiriasi tuo, ką dar žada.
  • Naujas mazgas visada tampa lapu. Nieko nepertvarkyk. Tai ne supaprastinimas ir ne laikinas sprendimas — forma, kurią duoda įterpimo tvarka, yra septinto žingsnio tema. Jei „pataisysi", nebeliks ko matuoti.
  • Kiekvienas raktų palyginimas eina per c.Hit(). Tas skaičius yra nueitas gylis.
  • Range privalo praleisti pomedžius, kuriuose atsakymo būti negali. Testas tikrina, kad aplankytų mazgų būtų gerokai mažiau nei visų — apėjimas su filtru pabaigoje neužskaitomas.
  • Height skaičiuoja mazgus, ne briaunas. Tuščias medis — 0, vienas mazgas — 1. Septinto žingsnio lentelė remiasi šiuo apibrėžimu.

Rekursija čia natūrali: Keys, Range ir Height aprašomi per patys save, kaip penktos pamokos apėjimai. Get, Put, Min ir Max yra paprasti ciklai — rekursija jiems nieko neduoda.

Spąstai

Put turi keisti rodyklę mazge, o ne jos kopiją.

cur := t.root          // kopija: prijungęs mazgą prie cur, prie medžio jo neprijungsi
cur := &t.root         // rodyklė į rodyklę: `*cur = &node{...}` keičia patį medį

Tai klasikinė šios užduoties klaida ir ji nepasireiškia iš karto: Put neišmeta klaidos, Len didėja, o Get neranda nieko. Antras variantas — arba rekursinis insert, grąžinantis naują pomedį — abu teisingi.