Colora un albero binario per essere un albero rosso-nero


16

Una domanda di intervista comune è quella di fornire un algoritmo per determinare se un determinato albero binario è bilanciato in altezza (definizione dell'albero AVL).

Mi chiedevo se possiamo fare qualcosa di simile con gli alberi Rosso-Nero.

Dato un albero binario non colorato arbitrario (con nodi NULL), esiste un algoritmo "veloce" che può determinare se possiamo colorare (e trovare una colorazione) i nodi Rosso / Nero in modo che soddisfino tutte le proprietà di un albero Rosso-Nero (definizione come in questa domanda )?

Un primo pensiero è stato che possiamo semplicemente rimuovere i nodi NULL e provare a verificare ricorsivamente se l'albero risultante può essere un albero rosso-nero, ma questo non sembra andare da nessuna parte.

Ho fatto (una breve) ricerca sul Web di documenti, ma non sono riuscito a trovarne nessuno che sembra affrontare questo problema.

È possibile che mi manchi qualcosa di semplice.


Sono abbastanza sicuro che un albero possa essere di colore rosso-nero iff per ogni nodo, il percorso più lungo da esso a un nodo NULL non è più di due volte più lungo di quello più corto. È abbastanza veloce?
Karolis Juodelė,

Risposte:


12

Se per ogni nodo di un albero, il percorso più lungo da esso a un nodo foglia non è più di due volte più lungo di quello più corto, l'albero ha una colorazione rosso-nera.

Ecco un algoritmo per capire il colore di qualsiasi nodo n

if n is root,
    n.color = black
    n.black-quota = height n / 2, rounded up.

else if n.parent is red,
    n.color = black
    n.black-quota = n.parent.black-quota.

else (n.parent is black)
    if n.min-height < n.parent.black-quota, then
        error "shortest path was too short"
    else if n.min-height = n.parent.black-quota then
        n.color = black
    else (n.min-height > n.parent.black-quota)
        n.color = red
    either way,
        n.black-quota = n.parent.black-quota - 1

Ecco n.black-quotail numero di nodi neri che ti aspetti di vedere andare a una foglia, dal nodo ned n.min-heightè la distanza dalla foglia più vicina.

Per brevità della notazione, sia , h ( n ) = e m ( n ) =b(n)= n.black-quotah(n)= n.heightm(n)= n.min-height .

Teorema: fissare un albero binario . Se per ogni nodo n T , h ( n ) 2 m ( n ) e per nodo r = radice ( T ) , b ( r ) [ 1TnTh(n)2m(n)r=root(T)quindiTha una colorazione rosso-nera con esattamenteb(r)nodi neri su ogni percorso dalla radice alla foglia.b(r)[12h(r),m(r)]Tb(r)

Prova: induzione su b(n) .

Verifica che tutti e quattro gli alberi di altezza uno o due soddisfino il teorema con .b(n)=1

Per definizione dell'albero rosso-nero, la radice è nera. Sia un nodo con un genitore nero p tale che b ( p ) [ 1np. Quindib(n)=b(p)-1,h(n)=h(p)-1eh(n)m(n)m(p)-1.b(p)[12h(p),m(p)]b(n)=b(p)1h(n)=h(p)1h(n)m(n)m(p)1

Supponiamo che il teorema valga per tutti gli alberi con radice , b ( r ) < brb(r)<b(q) .

Se , allora nb(n)=m(n)n può essere di colore rosso-nero dal presupposto induttivo.

Se quindib(n)=1b(p)=12h(p). nnon soddisfa il presupposto induttivo e quindi deve essere rosso. Siacfiglio din. h(c)=h(p)-2e b(c)=b(p)-1=1b(n)=12h(n)1ncnh(c)=h(p)2. Quindicb(c)=b(p)1=12h(p)1=12h(c)c può essere di colore rosso-nero dal presupposto induttivo.

Si noti che, con lo stesso ragionamento, se b(n)(12h(r),m(r))nnn


@Aryabhata, qualsiasi traversata va bene, purché il genitore sia visto davanti ai suoi figli. Non ho una prova formale scritta, ma ho un'idea di come sarebbe. Proverò a scrivere qualcosa quando posso.
Karolis Juodelė,

@Aryabhata, ho aggiunto una prova. Mi dispiace di aver impiegato così tanto tempo.
Karolis Juodelė,

@Aryabhata, l'idea è che se B(p) di qualche nodo p è dentro certi limiti, un figlio o un nipote c di p può avere B(c)all'interno di quegli stessi limiti. avereB(n) in tali limiti può corrispondere n being black. Most of the proof is about bounding h and m of a child or grandchild, given h and m of the parent or grandparent. Your tree is certainly colorable. b(root)=8, left child is black and right child is red, the path of length 16 is brbrbr, the path of length 8 is bbbbbbbb, paths of 9 and 12 can have multiple valid colorings.
Karolis Juodelė


2

I believe Karolis' answer is correct (and a pretty nice characterization of red-black trees, giving an O(n) time algorithm), just wanted to add another possible answer.

One approach is to use dynamic programming.

Given a tree, for each node n, you construct two sets: SR(n) and SB(n) which contains the possible black-heights for the subtree rooted at n. SR(n) contains the black-heights assuming n is coloured Red, and SB(n) assuming n is coloured black.

Now given the sets for n.Left and n.Right (i.e direct children of n), we can compute the corresponding sets for n, by taking appropriate intersections and unions (and incrementing as needed).

I believe this comes out be an O(nlogn) time algorithm.

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.