Supponiamo di avere una tabella piatta che memorizza una gerarchia ad albero ordinata:
Id Name ParentId Order
1 'Node 1' 0 10
2 'Node 1.1' 1 10
3 'Node 2' 0 20
4 'Node 1.1.1' 2 10
5 'Node 2.1' 3 10
6 'Node 1.2' 1 20
Ecco un diagramma, dove abbiamo [id] Name. Il nodo radice 0 è fittizio.
[0] ROOT
/ \
[1] Nodo 1 [3] Nodo 2
/ \ \
[2] Nodo 1.1 [6] Nodo 1.2 [5] Nodo 2.1
/
[4] Nodo 1.1.1
Quale approccio minimalista useresti per inviarlo a HTML (o testo, per quella materia) come un albero correttamente ordinato, correttamente rientrato?
Supponi inoltre di avere solo strutture di dati di base (array e hashmap), nessun oggetto di fantasia con riferimenti padre / figlio, nessun ORM, nessun framework, solo le tue due mani. La tabella è rappresentata come un set di risultati, a cui è possibile accedere in modo casuale.
Lo pseudo codice o l'inglese semplice va bene, questa è puramente una domanda concettuale.
Domanda bonus: esiste un modo fondamentalmente migliore per memorizzare una struttura ad albero come questa in un RDBMS?
MODIFICHE E AGGIUNTE
Per rispondere alla domanda di un commentatore ( Mark Bessey ): un nodo radice non è necessario, perché non verrà mai visualizzato comunque. ParentId = 0 è la convenzione per esprimere "questi sono di livello superiore". La colonna Ordine definisce come verranno ordinati i nodi con lo stesso genitore.
Il "set di risultati" di cui ho parlato può essere rappresentato come una serie di hashmap (per rimanere in quella terminologia). Per il mio esempio doveva essere già lì. Alcune risposte fanno il possibile e lo costruiscono per prime, ma va bene.
L'albero può essere arbitrariamente profondo. Ogni nodo può avere N figli. Tuttavia, non avevo esattamente in mente un albero da "milioni di voci".
Non confondere la mia scelta del nome del nodo ('Nodo 1.1.1') con qualcosa su cui fare affidamento. I nodi potrebbero ugualmente essere chiamati "Frank" o "Bob", non è implicita alcuna struttura di denominazione, questo era semplicemente per renderlo leggibile.
Ho pubblicato la mia soluzione in modo che voi ragazzi la possiate fare a pezzi.