Ho iniziato a codificare un sacco di diverse implementazioni di binari di ricerca di recente (AVL, splay, treap) e sono curioso di sapere se c'è un modo particolarmente "buono" di scrivere un iteratore per attraversare queste strutture. La soluzione che ho usato in questo momento è quella di fare in modo che ogni nodo nel BST memorizzi i puntatori agli elementi successivi e precedenti nella struttura, riducendo l'iterazione a un'iterazione di elenchi concatenati standard. Tuttavia, non sono davvero soddisfatto di questa risposta. Aumenta l'utilizzo dello spazio di ogni nodo di due puntatori (successivo e precedente), e in un certo senso è solo imbroglio.Implementazione di un iteratore su un albero di ricerca binario
Conosco un modo di costruire un iteratore di un albero di ricerca binario che utilizza lo spazio di memoria ausiliaria O (h) (dove h è l'altezza dell'albero) usando una pila per tenere traccia dei nodi di frontiera da esplorare in seguito , ma ho resistito alla codifica di questo a causa dell'uso della memoria. Speravo ci fosse un modo per costruire un iteratore che utilizza solo lo spazio costante.
La mia domanda è questa: c'è un modo per progettare un iteratore su un albero di ricerca binario con le seguenti proprietà?
- elementi sono visitati in ordine ascendente (cioè un attraversamento in ordine simmetrico)
next()
ehasNext()
query eseguite in O (1) tempo.- utilizzo della memoria è O (1)
Per rendere più facile, va bene se si assume che la struttura ad albero non cambia forma durante l'iterazione (cioè senza inserzioni, delezioni o rotazioni), ma sarebbe davvero bello se esistesse una soluzione che potesse davvero gestirlo.
Se l'albero attraversato è mutabile è possibile utilizzare un trucco da TAOCP I.2.3.1 Attraversare alberi binari, esercizio 21. Prende memoria O (N) e O (1). Quando l'algoritmo termina l'albero, ovviamente, non verrà modificato. Sarà lo stesso di prima. – Michael
Sembra esattamente la risposta che sto cercando. :-) – templatetypedef
Perché sei preoccupato per il sovraccarico della memoria di memorizzare una pila di nodi dell'albero nell'iteratore? È solo O (log n) con il numero di elementi nell'albero, se è ben bilanciato. –