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:
Putsu 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. Rangeprivalo 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.Heightskaič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.