Immagina un albero rosso-nero. C'è sempre una sequenza di inserzioni e cancellazioni che la crea?


41

Supponiamo che la seguente definizione di un albero rosso-nero:

  1. È un albero di ricerca binario.
  2. Ogni nodo è colorato in rosso o nero. La radice è nera
  3. Due nodi collegati da un bordo non possono essere rossi contemporaneamente.
  4. Qui dovrebbe esserci una buona definizione di una foglia NIL, come su wiki. La foglia NIL è di colore nero.
  5. Un percorso dalla radice a qualsiasi foglia NIL contiene lo stesso numero di nodi neri.


Domanda

Supponiamo di aver implementato le operazioni inserte deleteper l'albero rosso-nero. Ora, se ti viene dato un albero rosso-nero valido, c'è sempre una sequenza inserte deleteoperazioni che lo costruiscono?


Motivazione

Questa domanda è motivata da questa domanda e dalla discussione di questa domanda .

Personalmente, credo che se immagini un albero rosso-nero valido costituito solo da nodi neri (il che implica che stai immaginando un albero perfettamente bilanciato), c'è una sequenza inserte deleteoperazioni che lo costruiscono. Tuttavia,

  1. Non so come dimostrarlo accuratamente
  2. Sono anche interessato al caso più generale

La tua domanda sembra un po 'circolare ... qualsiasi insieme di operazioni di inserimento ed eliminazione costruirà un albero rosso-nero ... letteralmente qualsiasi cosa, dal momento che il rosso-nero è solo una definizione. La tua domanda è limitata a un albero puramente nero?
JOX,

2
No, penso che tu abbia capito male. Naturalmente, qualsiasi serie di inserti ed eliminazioni costruisce un albero rosso-nero. La domanda è questa: un albero che si adatta alla definizione è costruibile con una sequenza di inserti ed eliminazioni? Se ti viene dato un albero, puoi ricreare una sequenza di inserti ed eliminazioni?
alisianoi,

2
@ all3fox Sì, hai ragione. Esiste un algoritmo che utilizza l'operazione inserte deleteper costruire un albero rosso-nero valido costituito solo da nodi neri . Usa inserzioni / eliminazioni per creare un albero di altezza . In primo luogo, possiamo creare un albero rosso-nero perfettamente bilanciato in modo molto ampio usando inserzioni, quindi utilizzando inserimenti e la stessa quantità di eliminazioni lo ridipingono in un albero completamente nero. Il trucco qui è di salire di volte lo strato rosso più basso sull'albero fino a raggiungere la radice. h 2 h + 1 - 1 h 2 h - 1 h(h+2)2h1h2h+11h2h1h
Anton Trunov,

1
@AntonTrunov grazie, ho capito. Che ne dici del caso di un albero rosso-nero generale però? Cosa ne pensi, è possibile costruire un dato albero rosso-nero con inserte deleteoperazioni?
alisianoi,

2
a) La risposta dipenderà dalla precisa attuazione di inserte delete; ci possono essere diversi modi per eseguire queste operazioni. b) Poiché gli alberi RB sono essenzialmente alberi B di ordine 4, si può cercare ispirazione. I dettagli possono rivelarsi complicati poiché la mappatura da RB a B (e / o indietro) non è unica.
Raffaello

Risposte:


2

Le operazioni di inserimento ed eliminazione in un albero rosso-nero includono il bilanciamento necessario per mantenere le proprietà rosso-nero.

Il problema con alberi neri rossi non inclinati (a sinistra oa destra) è che esistono diversi modi per ripristinare l'oscurità rossa dopo l'eliminazione o l'inserimento di base.
Non è l'inserto o l'eliminazione che trasforma l'albero, ma il riequilibrio e la rotazione che si verificano successivamente per preservare / ripristinare il nero rosso dell'albero.

La descrizione di base dell'albero rosso-nero non prescrive quale delle possibili rotte prendere.
Potrebbe non essere possibile capire come ricostruire esattamente un determinato albero nero rosso, perché il riequilibrio non deve essere deterministico.

Ciò è stato "risolto" con alberi neri rossi inclinati a sinistra.
Esiste solo un modo per eseguire il bilanciamento. Quindi ogni albero nero rosso pendente può essere ricostruito usando inserti ed eliminazioni, poiché il riequilibrio / rotazione viene eseguito in un modo deterministico specifico.

Ciò non significa che gli alberi RB inclinati a sinistra siano migliori o più efficienti, ciò che ottengono da un lato usando regole di bilanciamento deterministico, dall'altro perdono con un codice di bilanciamento più complesso.

Secondo il commento di @ Anton:
esiste un algoritmo che utilizza l'operazione insert ed delete per costruire un albero rosso-nero valido costituito solo da nodi neri. Usa inserzioni / eliminazioni per creare un albero di altezza . Per prima cosa, possiamo creare un albero rosso-nero perfettamente bilanciato in modo molto ampio usando inserzioni, quindi usando inserimenti e la stessa quantità di eliminazioni lo ridipingono in un albero completamente nero. Il trucco qui è di salire di volte lo strato rosso più basso sull'albero fino a raggiungere la radice.h 2 h + 1 - 1 h 2 h - 1 h(h+2)2h1h2h+11h2h1h

Penso che un algoritmo di bilanciamento completo come Day-Stout-Warren sarebbe comunque più efficiente.


1
Utilizzando le operazioni inserte deletedal libro CLRS è possibile creare un albero RB valido costituito solo da nodi neri . Il trucco è inserire più nodi del necessario e quindi eliminare quelli eccessivi. L'algoritmo sarà eliminare i nodi rossi.
Anton Trunov,

@AntonTrunov, hai un link per quell'algoritmo, sarebbe bello includerlo nella risposta. Non riesco a trovarlo usando il mio google-fu.
Johan,

1
Purtroppo non ho un link. Ho provato a rispondere alla domanda in quel momento, e ho trovato un algoritmo per il caso speciale di tutti gli alberi neri. L'ho descritto in quel commento, ma non ho fornito una prova.
Anton Trunov,

Cosa intendi con "Questo è stato 'risolto' con alberi neri rossi inclinati a sinistra". Anche un albero nero rosso inclinato a sinistra ha diversi modi per conservare gli stessi oggetti.
user239558
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.