2010-04-03 36 views
5

Ho implementato la mia versione di un albero rosso-nero, basando principalmente i miei algoritmi su Wikipedia (http://en.wikipedia.org/wiki/Red-black_tree). È abbastanza conciso per la maggior parte, ma c'è una parte su cui vorrei un chiarimento.Alberi rosso-nero - Cancellazione di un nodo con due bambini non fogliari

Quando si cancella un nodo dall'albero che ha 2 figli non foglia (non NULL), si dice di spostare i figli di entrambi i lati nel nodo cancellabile e rimuovere tale figlio.

Sono un po 'confuso su quale lato rimuovere da, in base a quello. Seleziono il lato in modo casuale, faccio alternare tra i lati, o mi appiccico allo stesso lato per ogni futura cancellazione?

risposta

5

Se non si conoscono i dati di input, non è possibile sapere quale lato è più vantaggioso di essere il nuovo nodo intermedio o il nuovo figlio.

Si può quindi semplicemente applicare la regola che più si adatta a te (è più facile scrivere/calcolare - probabilmente "prendi sempre quello di sinistra"). L'utilizzo di uno schema casuale in genere introduce solo un calcolo non necessario.

+1

+1 - evitare di introdurre deliberatamente un comportamento casuale; a un certo punto, ci sarà un bug da qualche parte, e il comportamento casuale renderà gli effetti del bug più sconcertanti, più difficile da riprodurre in modo coerente, ecc. –

+0

Concordato. L'unica situazione in cui vale la pena introdurre comportamenti casuali consiste nel rendere il comportamento patologico del caso peggiore con bassa probabilità e imprevedibile, piuttosto che verificarsi in modo prevedibile su determinati input. Da qui la scelta casuale del pivot in qsort prima dell'invenzione dell'introsort. Non penso che il comportamento peggiore di un albero rosso-nero sia abbastanza grave da giustificarlo qui. C'è una ben nota struttura ad albero "probabilmente bilanciata", ma non riesco a ricordare il nome per il momento. –

+0

Grazie per la tua pronta risposta! – Salami

Problemi correlati