Colorez un arbre binaire pour être un arbre rouge-noir

16

Une question d'entretien courante consiste à fournir un algorithme pour déterminer si un arbre binaire donné est équilibré en hauteur (définition de l'arbre AVL).

Je me demandais si nous pouvions faire quelque chose de similaire avec les arbres rouges-noirs.

Étant donné un arbre binaire non coloré arbitraire (avec des nœuds NULL), existe-t-il un algorithme "rapide" qui peut déterminer si nous pouvons colorer (et trouver une coloration) les nœuds Rouge / Noir afin qu'ils satisfassent toutes les propriétés d'un arbre Rouge-Noir (définition comme dans cette question )?

Une pensée initiale était que nous pouvons simplement supprimer les nœuds NULL et essayer de vérifier récursivement si l'arbre résultant peut être un arbre rouge-noir, mais cela ne semble aller nulle part.

J'ai fait (une brève) recherche sur le Web des articles, mais je n'ai pas pu en trouver qui semblent résoudre ce problème.

Il est possible que je manque quelque chose de simple.

Aryabhata
la source
Je suis presque sûr qu'un arbre peut être de couleur rouge-noir si pour chaque nœud, le chemin le plus long de celui-ci vers un nœud NULL n'est pas plus de deux fois plus long que le plus court. Est-ce assez rapide?
Karolis Juodelė

Réponses:

12

Si pour chaque nœud d'un arbre, le chemin le plus long de celui-ci vers un nœud feuille n'est pas plus de deux fois plus long que le plus court, l'arbre a une coloration rouge-noir.

Voici un algorithme pour déterminer la couleur de n'importe quel nœud 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

Voici n.black-quotale nombre de nœuds noirs que vous vous attendez à voir aller à une feuille, à partir du nœud net n.min-heightla distance à la feuille la plus proche.

Par souci de concision, notons , h ( n ) = et m ( n ) = .b(n)= n.black-quotah(n)= n.heightm(n)= n.min-height

Théorème: Correction d' un arbre binaire . Si pour chaque nœud n T , h ( n ) 2 m ( n ) et pour le nœud r = racine ( T ) , b ( r ) [ 1TnTh(n)2m(n)r=root(T)puisTa une coloration rouge-noir avec exactementb(r)noeuds noirs sur chaque chemin de la racine à la feuille.b(r)[12h(r),m(r)]Tb(r)

Preuve: induction sur .b(n)

Vérifiez que les quatre arbres de hauteur un ou deux satisfont au théorème avec .b(n)=1

Par définition d'arbre rouge-noir, la racine est noire. Soit un nœud avec un parent noir p tel que b ( p ) [ 1np. Alorsb(n)=b(p)-1,h(n)=h(p)-1eth(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

Supposons que le théorème s'applique à tous les arbres dont la racine , b ( r ) < b ( q ) .rb(r)<b(q)

Si , alors n peut être coloré en rouge-noir par l'hypothèse inductive.b(n)=m(n)n

Si puisb(n)=1b(p)=12h(p). nne satisfait pas l'hypothèse inductive et doit donc être rouge. Soitcun enfant den. h(c)=h(p)-2et b(c)=b(p)-1=1b(n)=12h(n)1ncnh(c)=h(p)2. Alorscpeut être coloré en rouge-noir par l'hypothèse inductive.b(c)=b(p)1=12h(p)1=12h(c)c

Notons que, par le même raisonnement, si , alorsnet un enfant densatisfont tous deux à l'hypothèse inductive. Par conséquent,npourrait avoir n'importe quelle couleur.b(n)(12h(r),m(r))nnn

Karolis Juodelė
la source
@Aryabhata, tout parcours est correct, tant que le parent est vu avant ses enfants. Je n'ai pas de preuve formelle écrite, mais j'ai une idée de son apparence. J'essaierai d'écrire quelque chose quand je pourrai.
Karolis Juodelė
@Aryabhata, j'ai ajouté une preuve. Désolé j'ai mis beaucoup de temps.
Karolis Juodelė
@Aryabhata, l'idée est que si d'un nœud p respecte certaines limites, un enfant ou un petit-enfant c de p peut avoir b ( c ) dans ces mêmes limites. Avoir b ( n ) dans ces bornes peut correspondre à n étant noir. La plupart des preuves portent sur la délimitation de h et m d'un enfant ou d'un petit-enfant, étant donné h et m du parent ou du grand-parent. Votre arbre est certainement colorable. b ( r o o tb(p)pcpb(c)b(n)nhmhm , l'enfant gauche est noir et l'enfant droit est rouge, le chemin de longueur 16 est b r b r b r , le chemin de longueur 8 est b b b b b b b b , les chemins de 9 et 12 peuvent avoir plusieurs colorations valides. b(root)=8brbrbrbbbbbbbb
Karolis Juodelė
Il y a une question à propos de cette réponse .
David Richerby
2

Je crois que la réponse de Karolis est correcte (et une caractérisation assez agréable des arbres rouge-noir, donnant un algorithme de temps ), je voulais juste ajouter une autre réponse possible.O(n)

Une approche consiste à utiliser la programmation dynamique.

nSR(n)SB(n)nSR(n)nSB(n)n

n.Leftn.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.

Aryabhata
la source