Jeg har vært koding opp en haug med forskjellige binært søketre implementeringer nylig (AVL, spriker, treap) og er nysgjerrig på om det er en spesielt god måte å skrive en iterator å krysse disse strukturene. Den løsningen jeg har brukt akkurat nå er å få hver node i BST butikken pekere til neste og forrige elementer i treet, noe som reduserer iterasjon til en standard knyttet listen iterasjon. Men jeg er ikke veldig fornøyd med dette svaret. Det øker plassbruken til hver node med to pekere (neste og forrige), og i en viss forstand er det bare juks.
Jeg vet om en måte å bygge et binært søketre iterator som bruker O (h) hjelpe lagringsplass (der h er høyden av treet) ved hjelp av en stabel for å holde styr på grense noder for å utforske senere, men jeg er har motstått koding dette opp på grunn av minnebruk. Jeg håpet det er noen måte å bygge en iterator som bare bruker konstant plass.
Mitt spørsmål er dette - er det en måte å utforme en iterator over et binært søketre med følgende egenskaper?
- Elementene er besøkt i stigende rekkefølge (dvs. en inorder traversering)
next()oghasNext()spørringer kjøres i O (1) tid.- Hukommelse er O (1)
For å gjøre det lettere, er det fint hvis du antar at trestrukturen ikke endrer form under iterasjon (dvs. ingen innsett, slettinger eller rotasjoner), men det ville være veldig kult hvis det var en løsning som faktisk kunne håndtere dette.













