Base del algoritmo: ¿Qué es un árbol rojo-negro?

Antes de aprender los árboles rojo-negro, debe comprender el árbol de búsqueda binaria.

1. Árbol de búsqueda binaria

1. Características del árbol de búsqueda binaria (BST)

(1) el valor del subárbol izquierdo roommate node es menor o igual que el valor del nodo raíz.
(2) el subárbol derecho del valor en el nodo roommate es mayor o igual que el valor del nodo raíz.
(3) izquierdo y derecho Los subárboles también son árboles de clasificación binaria.

La siguiente figura es un árbol de búsqueda binario típico:
Inserte la descripción de la imagen aquí
¿Cuáles son los beneficios de tal estructura de datos? Tomemos el ejemplo de encontrar el número cuyo nodo es 10:

1. Ver el nodo raíz 9:

Inserte la descripción de la imagen aquí

2. Dado que 10> 9, observe al niño 13 de la derecha:

Inserte la descripción de la imagen aquí

3. Desde 10 <13, marque el hijo izquierdo 11:

Inserte la descripción de la imagen aquí

4. Dado que 10 <11, observe el hijo de la izquierda 10 y encuentre que 10 es el nodo para encontrar:

Inserte la descripción de la imagen aquí

2. Ventajas del árbol binario

Este método es exactamente la idea de la búsqueda binaria. El número máximo de búsquedas requeridas es equivalente a la altura del árbol de búsqueda binaria. Se usa un método similar al insertar nodos, y el tamaño del nuevo nodo resulta adecuado para la inserción. posición.

3. Defectos del árbol binario

El defecto del árbol binario se refleja principalmente en la inserción de nuevos nodos.

Suponga que el árbol de búsqueda binaria inicial tiene solo tres nodos, el valor del nodo raíz es 9, el valor secundario izquierdo es 8 y el valor secundario derecho es 12:
Inserte la descripción de la imagen aquí

A continuación, insertamos los siguientes cinco nodos a su vez: 7, 6, 5, 4, 3. Según las características del árbol de búsqueda binaria, ¿cómo será el resultado?
Inserte la descripción de la imagen aquí

Aunque la forma de la figura anterior también se ajusta a las características del árbol binario, el rendimiento de la búsqueda se reduce considerablemente y casi se vuelve lineal.

¿Cómo resolver el árbol de búsqueda binario desequilibrado varias veces para insertar un nuevo nodo que lo causó? Por lo tanto, un árbol rojo-negro .

Dos. Árbol Rojo-Negro

El árbol rojo-negro (Read Black Tree)es un árbol de búsqueda binario autoequilibrado. Además de cumplir con las características básicas de un árbol de búsqueda binario, también tiene las siguientes características adicionales ( deben cumplirse al mismo tiempo )

1. El nodo es rojo o negro.
2. El nodo raíz es negro.
3. Cada nodo hoja es un nodo vacío negro (nodo NIL).
4 Los dos nodos secundarios de cada nodo rojo son negros. (No puede haber dos nodos rojos consecutivos en todos los caminos desde cada hoja a la raíz)
5. Todos los caminos desde cualquier nodo a cada hoja contienen el mismo número de nodos negros.

El árbol de la figura siguiente es un árbol rojo-negro típico:
Inserte la descripción de la imagen aquíes precisamente debido a estas restricciones que se garantiza el auto-equilibrio del árbol rojo-negro. El camino más largo desde la raíz hasta la hoja del árbol rojo-negro no excederá el camino más corto. 2 veces.

Al insertar o eliminar nodos, es posible que se rompan las reglas del árbol rojo-negro. En este momento, es necesario realizar algunos ajustes para seguir manteniendo nuestras reglas.

¿Bajo qué circunstancias se romperán las reglas del árbol rojo-negro y bajo qué circunstancias se romperán las reglas? Citamos dos castañas simples:

1. Inserte un nuevo nodo con un valor de 14 en el árbol rojo-negro original:

Inserte la descripción de la imagen aquíDado que el nodo padre 15 es un nodo negro, esta situación no romperá las reglas del árbol rojo-negro y no se requiere ningún ajuste.

2. Inserte un nuevo nodo con un valor de 21 en el árbol rojo-negro original:

Inserte la descripción de la imagen aquíDado que el nodo principal 22 es un nodo rojo, esta situación rompe la regla 4 del árbol rojo-negro (dos nodos secundarios de cada nodo rojo son negros), y se deben realizar ajustes para que se ajuste nuevamente a las reglas del árbol rojo-negro.

Hay dos formas de ajustar: cambio de color y rotación. La rotación se divide en dos formas: rotación izquierda y rotación derecha.

Descoloramiento:

Para volver a cumplir con las reglas del árbol rojo-negro, intente cambiar el nodo rojo a negro o cambie el nodo negro a rojo.

La siguiente figura muestra una parte del árbol rojo-negro Tenga en cuenta que el nodo 25 no es el nodo raíz. Debido a que el nodo 21 y el nodo 22 aparecen en rojo continuamente, lo que no se ajusta a la regla 4, el nodo 22 cambia de rojo a negro:
Inserte la descripción de la imagen aquípero este no es el final, porque el nodo negro adicional rompe la regla 5, por lo que se produce una reacción en cadena. Es necesario continuar cambiando el nodo 25 de negro a rojo:
Inserte la descripción de la imagen aquí
todavía no ha terminado en este momento, porque el nodo 25 y el nodo 27 han formado dos nodos rojos consecutivos, y el nodo 27 debe cambiarse de rojo a negro:

Girar a la izquierda:

Gire los dos nodos del árbol rojo-negro en sentido antihorario para que el nodo principal sea reemplazado por su propio hijo derecho, y usted se convierta en su propio hijo izquierdo. Es extraño decir, veamos la imagen de abajo: En la
Inserte la descripción de la imagen aquíimagen, Y, que es el niño derecho, reemplaza a X, y X se convierte en su propio hijo izquierdo. Esta es la rotación a la izquierda.

Gira a la derecha:

Gire los dos nodos del árbol rojo-negro en el sentido de las agujas del reloj para que el nodo principal sea reemplazado por su propio hijo izquierdo y usted se convierta en su propio hijo derecho. Mire la imagen de abajo: En la
Inserte la descripción de la imagen aquíimagen, Y, el hijo de la izquierda, reemplaza a X, y X se convierte en su hijo de la derecha. Esta es una rotación correcta.

Inserte la descripción de la imagen aquíEntonces, ¿cuándo usar el cambio de color y cuándo usar la rotación?

La inserción y eliminación de árboles rojo-negro contiene muchas situaciones, y cada situación tiene un método de procesamiento diferente.

Pongamos un ejemplo típico, todos experimentarán:

Tomemos el caso de insertar el nodo 21 como ejemplo:
Inserte la descripción de la imagen aquíprimero, lo que tenemos que hacer es cambiar el color del nodo 25 y los nodos debajo de él:
Inserte la descripción de la imagen aquíen este momento el nodo 17 y el nodo 25 son dos nodos rojos consecutivos, luego cambiar el nodo 17 ¿En un nodo negro? Me temo que es inapropiado. Esto no solo rompe la Regla 4, sino que de acuerdo con la Regla 2 (el nodo raíz es negro), es imposible convertir el nodo 13 en un nodo rojo.

La decoloración ya no puede resolver el problema. Consideramos el nodo 13 como X y el nodo 17 como Y, y giramos a la izquierda como en el diagrama que acaba de hacer:

Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquíInserte la descripción de la imagen aquíDado que el nodo raíz debe ser un nodo negro, debe cambiar de color. El resultado del cambio de color es el siguiente: ¿Es
Inserte la descripción de la imagen aquíeste el final? De ningún modo. Debido a que la cantidad de nodos negros en las dos rutas (17 -> 8 -> 6 -> NIL) es 4, la cantidad de nodos negros en las otras rutas es 3, lo que no cumple la regla 5.

En este momento, debemos considerar el nodo 13 como X y el nodo 8 como Y, y rotar hacia la derecha como en el diagrama de ahora:
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquíInserte la descripción de la imagen aquíFinalmente, cambie el color de acuerdo con las reglas: de
Inserte la descripción de la imagen aquíesta manera, nuestro árbol rojo-negro vuelve a cumplir con las reglas. El proceso de ajuste de este ejemplo es más complicado y ha pasado por los siguientes pasos:

Cambio de color -> Girar a la izquierda -> Cambio de color -> Girar a la derecha -> Cambio de color

Tres. Escenarios de aplicación de árboles rojo-negros

Hay muchas aplicaciones de árboles rojo-negro. Entre ellas, las clases de colección TreeMap y TreeSet del JDK son implementadas por árboles rojo-negro. En Java 8, incluso HashMap también usa árboles rojo-negro.

Algunas notas:

1. En cuanto al ajuste del auto-equilibrio del árbol rojo-negro, hay muchas situaciones involucradas al insertar y eliminar nodos. Por razones de espacio, es imposible enumerarlos uno por uno. Los amigos que estén interesados ​​pueden consultar Wikipedia, que es muy claro.

2. El ejemplo anterior del proceso de ajuste del árbol rojo-negro es una situación más complicada, y los socios pequeños que no entienden con demasiada claridad no tienen que estar en la esquina. La clave es comprender la idea principal del ajuste del auto-equilibrio del árbol rojo-negro.

Supongo que te gusta

Origin blog.csdn.net/gaolh89/article/details/104400606
Recomendado
Clasificación