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.
Réponses:
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
Voici
n.black-quota
le nombre de nœuds noirs que vous vous attendez à voir aller à une feuille, à partir du nœudn
etn.min-height
la distance à la feuille la plus proche.Par souci de concision, notons , h ( n ) = et m ( n ) = .b(n)= h(n)= m(n)=
n.black-quota
n.height
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 ) ∈ [ 1T n∈T h(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)] T b(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 ) ∈ [ 1n p . 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)−1 h(n)=h(p)−1 h(n)≥m(n)≥m(p)−1
Supposons que le théorème s'applique à tous les arbres dont la racine , b ( r ) < b ( q ) .r b(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)⌉−1 n c n h(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)) n n n
la source
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.
I believe this comes out be anO(nlogn) time algorithm.
la source