Una pregunta común de la entrevista es dar un algoritmo para determinar si un árbol binario dado está equilibrado en altura (definición de árbol AVL).
Me preguntaba si podemos hacer algo similar con los árboles rojo-negros.
Dado un árbol binario arbitrario sin color (con nodos NULL), ¿existe un algoritmo "rápido" que pueda determinar si podemos colorear (y encontrar un color) los nodos Rojo / Negro para que satisfagan todas las propiedades de un árbol Rojo-Negro (definición como en esta pregunta )?
Un pensamiento inicial fue que simplemente podemos eliminar los nodos NULL e intentar verificar recursivamente si el árbol resultante puede ser un árbol rojo-negro, pero eso no parece ir a ninguna parte.
Hice (una breve) búsqueda en la web de documentos, pero no pude encontrar ninguno que pareciera tratar este problema.
Es posible que me falte algo simple.
fuente
Respuestas:
Si para cada nodo de un árbol, el camino más largo desde él hasta un nodo de hoja no es más de dos veces más largo que el más corto, el árbol tiene una coloración rojo-negra.
Aquí hay un algoritmo para descubrir el color de cualquier nodo
n
Aquí
n.black-quota
está el número de nodos negros que espera ver yendo a una hoja, desde el nodon
yn.min-height
es la distancia a la hoja más cercana.Por razones de brevedad de la notación, dejar que , h ( n ) = y m ( n ) = .b(n)= h(n)= m(n)=
n.black-quota
n.height
n.min-height
Teorema: Fijar un árbol binario . Si para cada nodo n ∈ T , h ( n ) ≤ 2 m ( n ) y para el nodo r = raíz ( T ) , b ( r ) ∈ [ 1T n∈T h(n)≤2m(n) r=root(T) entoncesTtiene una coloración rojo-negra con exactamenteb(r)nodos negros en cada camino desde la raíz hasta la hoja.b(r)∈[12h(r),m(r)] T b(r)
Prueba: Inducción sobre .b(n)
Verifique que los cuatro árboles de altura uno o dos satisfagan el teorema con .b(n)=1
Por definición de árbol rojo-negro, la raíz es negra. Sea un nodo con un padre negro p tal que b ( p ) ∈ [ 1n p . Entoncesb(n)=b(p)-1,h(n)=h(p)-1yh(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
Suponga que el teorema se cumple para todos los árboles con raíz , b ( r ) < b ( q ) .r b(r)<b(q)
Si , entonces n puede ser de color rojo-negro por el supuesto inductivo.b(n)=m(n) n
Si luegob(n)=⌈1b(p)=12h(p) . nno satisface el supuesto inductivo y, por lo tanto, debe ser rojo. Seachijo den. h(c)=h(p)-2y b(c)=b(p)-1=1b(n)=⌈12h(n)⌉−1 n c n h(c)=h(p)−2 . Entoncescpuede ser de color rojo-negro por el supuesto inductivo.b(c)=b(p)−1=12h(p)−1=12h(c) c
Tenga en cuenta que, por el mismo razonamiento, si , entonces tantoncomo un hijo densatisfacen el supuesto inductivo. Por lo tanto,npodría tener cualquier color.b(n)∈(12h(r),m(r)) n n n
fuente
Creo que la respuesta de Karolis es correcta (y una caracterización bastante agradable de los árboles rojo-negros, dando un algoritmo de tiempo ), solo quería agregar otra posible respuesta.O(n)
Un enfoque es usar programación dinámica.
Dado un árbol, para cada nodo , construye dos conjuntos: S R ( n ) y S B ( n ) que contiene las posibles alturas negras para el subárbol enraizado en n . S R ( n ) contiene las alturas negras suponiendo que n es de color rojo, y S B ( n ) suponiendo que n es de color negro.n SR(n) SB(n) n SR(n) n SB(n) n
Ahora dados los conjuntos para y n . R i g h t (es decir, hijos directos de n ), podemos calcular los conjuntos correspondientes para n , tomando intersecciones y uniones apropiadas (e incrementándolas según sea necesario).n.Left n.Right n n
Creo que esto resulta ser un algoritmo de tiempo .O(nlogn)
fuente