Está en la página 1de 15

Directorio de artículos

1. Introducción al árbol rojo-negro

2. La naturaleza de los árboles rojo-negros


3. Operación del árbol rojo-negro

3.1 Operación de rotación


3.2 Insertar

3.2.1 Caso uno

3.2.2 Caso 2
3.2.3 Caso tres

3.2.4 Situación 4
3.2.5 Situación 5
3.2.6 Insertar resumen

3.3 Eliminar
3.3.1 Caso 1
3.3.2 Caso 2

3.3.2 Caso tres


3.3.4 Situación cuatro
  Anterior (/2018/01/11/TreeMap源码分析/)
3.3.5 Situación 5

3.3.6 Situación 6
3.3.7 Eliminar resumen

4. Resumen
referencia
Análisis detallado del árbol rojo-negro
 2018-01-11 (/2018/01/11/红黑树详细分析/)  Algoritmos fundamentales (/categories/basic-algorithm/) ► Buscar (/categories/basic-algorithm/search/) 
Estructura de datos (/tags/数据结构/) , algoritmo (/tags/算法/) , árbol rojo-negro (/tags/红黑树/)  (/2018/01/11/红黑树详细分析/#comments) comentario
(/2018/01/11/红黑树详细分析/#comments)

1. Introducción al árbol rojo-negro


El árbol rojo-negro es un árbol de búsqueda binario autoequilibrado y un árbol de búsqueda eficiente. Fue inventado por Rudolf Bayer en 1978 y se llamó
en ese momento 对称二叉 B 树(symmetric binary B-trees) . Posteriormente, en 1978, fue modificado por Leo J. Guibas y Robert Sedgewick al actual 红
黑树 . Árbol rojo-negro con buena eficiencia, se puede O(logN) completar a tiempo para buscar, agregar, eliminar y otras operaciones. Por lo tanto, los
árboles rojo-negro se utilizan ampliamente en la industria. Por ejemplo, TreeMap en Java, HashMap en JDK 1.8 y mapas en C ++ STL se implementan en
base a la estructura de árbol rojo-negro. Teniendo en cuenta que el árbol rojo-negro es una estructura de datos muy utilizada, es necesario que lo
entendamos.

  Anterior (/2018/01/11/TreeMap源码分析/)

2. La naturaleza de los árboles rojo-negros


Los estudiantes que han estudiado árboles de búsqueda binarios saben que los árboles de búsqueda binarios ordinarios pueden degenerar en listas
vinculadas en casos extremos, y la eficiencia de la adición, eliminación y verificación será relativamente baja en este momento. Para evitar esta situación,
existen algunos árboles de búsqueda autoequilibrados, como AVL, árboles rojo-negro, etc. Estos árboles de búsqueda autoequilibrados controlan la
diferencia de altura de los subárboles izquierdo y derecho de cualquier nodo dentro de un rango específico mediante la definición de algunas
propiedades para lograr un estado equilibrado. Tomando el árbol rojo-negro como ejemplo, el árbol rojo-negro logra el auto-equilibrio a través de las
siguientes definiciones de propiedades:

1. Los nodos son rojos o negros.


2. La raíz es negra.
3. Todas las hojas son negras (las hojas son NILOS nudos).
4. Cada nodo rojo debe tener dos nodos secundarios negros. (No puede haber dos nodos rojos consecutivos en todos los caminos desde cada hoja
hasta la raíz).
5. Todas las rutas simples de cualquier nodo a cada hoja contienen el mismo número de nodos negros (denominados alturas negras).

Con las propiedades anteriores como limitaciones, se puede evitar la situación en la que el árbol de búsqueda binaria degenera en una lista enlazada
individualmente. Sin embargo, no basta con evitar esta situación, aquí tenemos que considerar la longitud de la ruta desde un determinado nodo hasta
cada uno de sus nodos hoja. Si la longitud de algunas rutas es demasiado larga, la eficiencia se reducirá en gran medida al agregar, eliminar y verificar las
órdenes en estas rutas. En este momento, se resalta el uso de las propiedades 4 y 5. Con estas dos propiedades como restricciones, se puede asegurar
que la ruta más larga desde cualquier nodo a cada nodo hoja no excederá el doble de la ruta más corta. Las razones son las siguientes:

Cuando un determinado camino es el más corto, este camino debe estar compuesto por nodos negros. Cuando la longitud de una determinada ruta es la
más larga, la ruta debe estar compuesta de nodos rojos y negros alternativamente (la propiedad 4 restringe que no puede haber dos nodos rojos
consecutivos). La propiedad 5 también define que todas las rutas desde cualquier nodo a cada uno de sus nodos hoja deben contener el mismo número
de nodos negros. En este momento, en el caso de la ruta más larga, el número de nodos rojos en la ruta = la cantidad de nodos negros. La longitud de la
ruta es el doble del número de nodos negros, que es el doble de la longitud de la ruta más corta. Para ver un ejemplo, vea la imagen a continuación:

  Anterior (/2018/01/11/TreeMap源码分析/)
La imagen de arriba muestra las rutas más largas y más cortas desde el nodo raíz M hasta sus nodos hoja. Lazy here solo dibuja dos caminos más largos,
de hecho, hay 4 caminos más largos, respectivamente:

M -> Q -> O -> N

M -> Q -> O -> p

M -> Q -> Y -> X

M -> Q -> Y -> Z

La longitud es 4, el camino más corto es M -> E y la longitud es 2. La longitud del camino más largo es exactamente el doble de la longitud del camino
más corto.

Mencioné algunas de las propiedades de los árboles rojo-negro, y hay algunas otras cosas que deben agregarse aquí. En la introducción a la sección del
árbol rojo-negro, no se llama cuando se inventó el árbol rojo-negro 红黑树 , pero se llama 对称二叉 B 树 . A partir del nombre, puede encontrar que el
árbol rojo-negro y el árbol B (aquí se refiere al árbol 2-3) puede tener ciertos Los hechos también son ciertos. Si la naturaleza del árbol rojo-negro se
modifica ligeramente, el árbol rojo-negro y el árbol B pueden formar una correspondencia uno a uno. Aquí no se explican los detalles de la relación entre
  Anterior (/2018/01/11/TreeMap源码分析/)
el árbol rojo-negro y el árbol B. Quienes estén interesados pueden consultar la cuarta edición de "Algoritmo"
(https://book.douban.com/subject/19952400/) , que es muy completa.

3. Operación del árbol rojo-negro


Las operaciones básicas de un árbol rojo-negro son las mismas que las de otras estructuras de árbol, y generalmente incluyen operaciones como buscar,
insertar y eliminar. Como se mencionó anteriormente, el árbol rojo-negro es un árbol de búsqueda binario autoequilibrado. Dado que es una especie de
árbol de búsqueda binaria, el proceso de búsqueda es el mismo que el árbol de búsqueda binaria, que es relativamente simple, así que no lo haré.
repítelo aquí. En comparación con la operación de búsqueda, las operaciones de inserción y eliminación del árbol rojo-negro son mucho más
complicadas. En particular, hay muchas situaciones con las que lidiar en la operación de borrado, pero si se calma y la observa, encontrará que en realidad
no es tan difícil como pensaba. Bien, eso es todo una tontería, pasemos al tema.

3.1 Operación de rotación


Antes de analizar las operaciones de inserción y eliminación, es necesario insertar un equipo aquí. Permítanme explicar la operación de rotación. Esta
operación se utilizará en operaciones posteriores. Las operaciones de rotación se dividen en izquierda y derecha, la izquierda rota un nodo hacia el hijo
izquierdo de su hijo derecho y el derecho rota un nodo hacia el hijo derecho de su hijo izquierdo. Esto suena un poco complicado, así que mire la imagen
a continuación:

La figura anterior contiene un diagrama esquemático de zurdos y diestros. Aquí, se utiliza como ejemplo diestro. Los pasos del nodo M para diestros son
los siguientes:

1. Apunte la referencia secundaria izquierda del nodo M al hijo derecho del nodo E
2. Apunte la referencia secundaria derecha del nodo E al nodo M para completar la rotación

  Anterior (/2018/01/11/TreeMap源码分析/)
La operación para diestros se analiza arriba, y la operación para zurdos es similar a esta. Si estás interesado en hacer un dibujo tú mismo, pruébalo. No lo
repetiré aquí. La operación de rotación en sí no es complicada, así que analicémosla primero.

3.2 Insertar
El proceso de inserción del árbol rojo-negro es básicamente similar al proceso de inserción del árbol de búsqueda binaria. La diferencia es que después
de que el árbol rojo-negro inserta un nuevo nodo, es necesario ajustarlo para cumplir con la naturaleza del árbol rojo-negro. La propiedad 1 estipula que
el color del nodo del árbol rojo-negro es rojo o negro ¿Al insertar un nuevo nodo, este nodo debe ser rojo o negro? La respuesta es roja y la razón no es
difícil de entender. Si el nodo insertado es negro, entonces la ruta de este nodo tiene un nodo negro más que otras rutas. Este ajuste será más
problemático (consulte la operación de eliminación del árbol rojo-negro para saber por qué hay uno más o uno menos). nodo negro, ajuste Es muy
molesto levantarse). Si el nodo insertado es rojo, el número de nodos negros en todas las rutas permanece sin cambios y solo pueden aparecer dos
nodos rojos consecutivos. En este caso, puedes ajustarlo cambiando el color y girándolo, que es mucho más simple que antes.

A continuación, analizaremos el árbol rojo-negro después de insertar el nodo rojo. Supongamos aquí que el nodo que se va a insertar es N, el nodo padre
de N es P, el nodo abuelo es G y el nodo tío es U. Después de insertar el nodo rojo, habrá 5 situaciones, como sigue:

3.2.1 Caso uno


El nuevo nodo N insertado es el nodo raíz del árbol rojo-negro, en este caso cambiamos el color del nodo N de rojo a negro y se cumple la propiedad 2
(la  Anterior
 raíz es negra). Al mismo tiempo, después de que N se tiñe de negro, el número de nodos negros en todos los caminos del árbol rojo-negro aumenta
(/2018/01/11/TreeMap源码分析/)
en uno, y la propiedad 5 (todos los caminos simples desde cualquier nodo a cada hoja contienen el mismo número de nodos negros) todavía está
satisfecho.
3.2.2 Caso 2
El nodo padre de N es negro. En este caso, la propiedad 4 (cada nodo rojo debe tener dos nodos secundarios negros) y la propiedad 5 no se ven
afectadas y no es necesario ajustarlas.

3.2.3 Caso tres


El nodo padre de N es rojo (el nodo P es rojo y su padre debe ser negro), y el nodo tío U también es rojo. Dado que tanto P como N son rojos, todas las
propiedades 4 están rotas y deben ajustarse en este momento. En este caso, primero tiñe los colores de P y U a negro, y luego tiñe el color de G a rojo. En
este momento, el número de nodos negros en el camino a través de G permanece sin cambios y la propiedad 5 aún se satisface. Pero debe tenerse en
cuenta que después de que G se tiñe de rojo, puede formar un nodo rojo continuo con su nodo principal, y debe ajustarse hacia arriba de forma recursiva
en este momento.

3.2.4 Situación 4
  Anterior (/2018/01/11/TreeMap源码分析/)
El nodo padre de N es rojo y el nodo del tío es negro. El nodo N es el hijo derecho de P y el nodo P es el hijo izquierdo de G. En este momento, primero
gire el nodo P hacia la izquierda y ajuste las posiciones de N y P. A continuación, proceda según el caso 5 para restaurar la naturaleza 4.
3.2.5 Situación 5
El nodo padre de N es rojo y el nodo del tío es negro. N es el hijo izquierdo de P y el nodo P es el hijo izquierdo de G. En este momento, gire G hacia la
derecha, ajuste las posiciones de P y G e intercambie colores. Después de tales ajustes, Nature 4 se restauró sin destruir Nature 5.

3.2.6 Insertar resumen


Entre los cinco casos anteriores, el Caso 1 y el Caso 2 son relativamente simples, y los Casos 3, 4 y 5 son un poco más complicados. Pero si observa con
atención, encontrará que la diferencia entre estas tres situaciones radica en el color del nodo del tío. Si el nodo del tío es rojo, simplemente cambie el
color. Si el nodo del tío es negro, debe elegir la opción y luego intercambiar los colores. Cuando se juntan las imágenes de estas tres situaciones, la
diferencia es más fácil de observar, como se muestra en la siguiente figura:
  Anterior (/2018/01/11/TreeMap源码分析/)
  Anterior (/2018/01/11/TreeMap源码分析/)
3.3 Eliminar
En comparación con la operación de inserción, la operación de eliminación del árbol rojo-negro es más complicada. La operación de eliminación debe
determinar primero cuántos hijos tiene el nodo que se eliminará. Si hay dos hijos, el nodo no se puede eliminar directamente. En su lugar, busque
primero el predecesor (el nodo más grande en el subárbol izquierdo del nodo) o el sucesor (el nodo más pequeño en el subárbol derecho del nodo) del
nodo, y luego copie el valor predecesor o sucesor en el nodo que se va a eliminar. y, finalmente, elimine el predecesor o el sucesor. Dado que el
predecesor y el sucesor tienen como máximo un nodo hijo, podemos convertir el problema original del nodo que se eliminará con dos hijos en el
problema de un solo nodo hijo El problema se simplifica. No nos importa si el nodo que finalmente se elimina es el que queremos eliminar, siempre que
el valor en el nodo finalmente se elimine, no importa cómo cambie la estructura del árbol.

La complejidad de la operación de eliminación del árbol rojo-negro radica en el color del nodo eliminado. Cuando el nodo eliminado es rojo, el nodo
secundario se puede usar directamente para llenar el espacio. Debido a que se elimina el nodo rojo, la propiedad 5 (todas las rutas simples desde
cualquier nodo a cada hoja contienen el mismo número de nodos negros) aún se puede satisfacer. Cuando el nodo eliminado es negro, entonces el
número de nodos negros en todas las rutas que pasan a través del nodo se reduce en uno, destruyendo la propiedad 5. Si el hijo del nodo es rojo,
reemplace el nodo eliminado con el nodo hijo directamente y tiñe el nodo hijo de negro para restaurar la propiedad 5. Pero si el nodo hijo es negro, será
mucho más complicado de manejar. Se divide en 6 situaciones, que se explicarán a continuación.

Antes de comenzar la explicación, hagamos algunas suposiciones para facilitar la explicación. Se supone aquí que el nodo final que se va a eliminar X (a
lo sumo sólo un nodo hijo), que es el nodo hijo N , X el nodo hermano S , S el nodo izquierdo es S L , el nodo derecho de S R & lt . La siguiente discusión
se basa en que el nodo X se elimina y el N reemplazo del nodo se X lleva a cabo. Aquí se explica que X la razón para eliminar el nodo eliminado
específicamente es para evitar que todos piensen erróneamente que el nodo N se eliminará; de lo contrario, no podrá entenderlo más tarde.

Sobre la base de lo anterior, la discusión puede comenzar a continuación. Hay 6 casos de eliminación de árboles rojo-negro, a saber:

3.3.1 Caso 1

N es la nueva raíz. En este caso, hemos terminado. Eliminamos un nodo negro de todas las rutas y la nueva raíz es negra, por lo que las propiedades
  Anterior (/2018/01/11/TreeMap源码分析/)
permanecen.

Lo anterior es una descripción de la eliminación del árbol rojo-negro en Wikipedia. Como no hay imagen, es un poco mareado. Después de pensar, creo
que podría ser la siguiente situación:

El nodo X que se eliminará es el nodo raíz, y los nodos secundarios izquierdo y derecho son todos nodos vacíos. En este momento, reemplace el nodo X
con nodos vacíos para completar la operación de eliminación.
Puede haber otras situaciones, si lo sabe, hágamelo saber.

3.3.2 Caso 2
S es rojo y otros nodos son negros. En este caso, puede realizar una operación a la izquierda en el nodo principal de N y luego intercambiar los colores de
P y S. Pero esto no ha terminado, hay 3 nodos negros ( P -> X -> N ) antes de que se elimine la ruta a través de los nodos P y N , y ahora solo hay dos (
P -> N ). Hay un nodo negro menos que la ruta que no pasa por N, y la propiedad 5 aún no se satisface y se necesitan más ajustes. Pero en este
momento, se puede ajustar de acuerdo con las situaciones cuatro, cinco y seis.

3.3.2 Caso tres


El nodo padre de N, los nodos hermanos S y los nodos hijos de S son todos negros. En este caso, S puede ser simplemente de color rojo, y todos los
caminos a través de S tienen un nodo negro menos que antes, de modo que el número de nodos negros en el camino a través de N es el mismo que en
el camino a través de S. Sin embargo, la ruta que pasa por P es un nodo negro menos que la ruta que no pasa por P. En este momento, P debe
equilibrarse desde el principio de la situación.

  Anterior (/2018/01/11/TreeMap源码分析/)

3.3.4 Situación cuatro


El nodo padre de N es rojo y el nodo del tío es negro. El nodo N es el hijo derecho de P y el nodo P es el hijo izquierdo de G. En este momento, primero
gire el nodo P hacia la izquierda y ajuste las posiciones de N y P. A continuación, proceda según el caso 5 para restaurar la naturaleza 4.
Debe tenerse en cuenta aquí que el nodo N en la figura anterior no es un nodo recién insertado. Cuando P es rojo, P tiene dos nodos secundarios y todos
los nodos secundarios son negros, por lo que el número de nodos negros en la ruta de G a cada nodo hoja puede ser consistente. Dado que P ya tiene
dos hijos, N no es un nodo recién insertado. En el caso cuatro, se inserta un nuevo nodo en el subárbol con el nodo raíz N. Después del ajuste, N se
cambia a rojo, lo que a su vez conduce a la aparición del caso cuatro. Considere la siguiente situación (el nodo P R es el nodo N en la figura anterior):

Como se muestra en la figura anterior, inserte el nodo N y trátelo de acuerdo con el caso tres. En este momento, P R se tiñe de rojo, formando un nodo
rojo continuo con el nodo P. En este momento, debe ajustarse nuevamente de acuerdo con la cuarta situación.

3.3.5 Situación 5
S es negro, el hijo izquierdo de S es rojo y el hijo derecho es negro. El color del nodo padre de N puede ser rojo o negro, y N es el hijo izquierdo de P. En
este caso, gire S hacia la derecha e intercambie los colores de S y S L. En este momento, el número de negros en todos los caminos sigue siendo igual, el
nodo hermano N cambia de S a S L y el hijo derecho de S L se vuelve rojo. A continuación, continuamos analizando el caso seis.

3.3.6 Situación 6
S es negro y el hijo derecho de S es rojo. El color del nodo padre de N puede ser rojo o negro, y N es el hijo izquierdo de su nodo padre. En este caso,
  Anterior (/2018/01/11/TreeMap源码分析/)
realizamos una operación con la mano izquierda en P, intercambiamos los colores de P y S, y cambiamos S R a negro. Debido a que P se vuelve negro, hay
un nodo negro más en el camino a través de N, y el número de nodos negros en el camino a través de N es el mismo que el número antes de la
eliminación. Para un camino que no pasa por N, existen las siguientes dos situaciones:

1. Si esta ruta pasa por el nuevo nodo hermano S L de N , debe pasar antes por S y P. Y ahora S y P solo intercambian colores, lo que no afecta el camino a
través de S L.
2. El nuevo camino pasa por el nodo del tío N S R & lt , antes de que esté vinculado a través de ese P, S y S R & lt , pero ahora solo después de S y S R & lt .
Después de que P es zurdo y el color se cambia con S, en la ruta a través de S R falta un nodo negro y la propiedad 5 se rompe. Además, dado que el
color de S puede ser rojo o negro, si S es rojo, formará un nodo rojo continuo con S R , rompiendo la propiedad 4 (cada nodo rojo debe tener dos
nodos secundarios negros). En este momento, sólo es necesario cambiar S R de rojo a negro para restaurar tanto la propiedad 4 y la propiedad 5
(todos los caminos sencillos de cualquier nodo para cada hoja contener el mismo número de nodos negros.).

3.3.7 Eliminar resumen


Hay muchos casos de eliminación de árboles rojo-negro, y puede sentirse mareado cuando lo mira por primera vez. Puede haber una pregunta de este
tipo, ¿por qué el árbol rojo-negro tiene este tipo de eliminación, por qué hay otra situación, cuáles son las conexiones y diferencias entre ellos? Como
todos los demás, tuve esta confusión cuando lo vi por primera vez, hasta que dibujé los gráficos correspondientes a todas las situaciones juntas, y todo
quedó claro. En este momento, 4 palabras aparecieron en el cielo, tan, tan, tan. Entonces, mire la imagen:

  Anterior (/2018/01/11/TreeMap源码分析/)
  Anterior (/2018/01/11/TreeMap源码分析/)
4. Resumen

El árbol rojo-negro es un árbol binario importante, que se usa ampliamente, pero no aparece muchas veces en muchos libros relacionados con la
estructura de datos. Muchos libros no hablan de ello o simplemente lo cubren de un solo golpe, sin un análisis detallado, esto puede deberse a que el
árbol rojo-negro es más complicado. También encontré mucha información cuando estaba estudiando Red-Black Tree, pero la sensación general no era
muy buena. Especialmente cuando estaba aprendiendo la operación de eliminación, mucha información era realmente ilegible y me resultaba doloroso
leerla. Hasta que vi el análisis de árboles rojo-negro (https://en.wikipedia.org/wiki/Red%E2%80%93black_tree) en Wikipedia , estaba muy feliz. El análisis
de este artículo es muy metódico, conciso y mucho mejor que mucha información. El análisis del árbol rojo-negro en este artículo también se refiere
principalmente al análisis del árbol rojo-negro en Wikipedia, y explica los lugares en Wikipedia que son propensos a dudas y malentendidos. Al mismo
tiempo, la imagen en el texto del árbol rojo-negro de la versión china de Wikipedia está borrosa, así que la volví a dibujar aquí. Cabe señalar que la
versión china de Wikipedia no se puede abrir y que los enlaces a Wikipedia en el texto están todos en inglés. Además, recomiendo un sitio web de
visualización de la estructura de datos, que contiene un proceso común de visualización de la estructura de datos, la dirección es: t.cn/RZFgryr
(https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) .

Además, debido a que el árbol rojo-negro en sí es más complicado, su implementación también es más complicada. Antes de escribir este artículo, traté
de usar el lenguaje Java para implementar operaciones de adición y eliminación de árboles rojo-negro. Al final, solo escribí la operación del nuevo nodo,
pero la eliminación no se realizó. Además, la nueva lógica escrita por mí es demasiado engorrosa, y la escritura no es bonita y es imposible demostrarlo.
Así que al final, copié el código fuente relevante de TreeMap en Java, modifiqué el código fuente de acuerdo con mis propias necesidades y apenas me di
cuenta del árbol rojo-negro. El código se coloca en github, Portal -> RBTree.java
(https://github.com/code4wt/basic_algorithm/blob/master/src/main/java/search/RBTree.java) .

Finalmente, si también está aprendiendo sobre árboles rojo-negros, espero que este artículo pueda ayudarlo. Además, debido a la complejidad del árbol
rojo-negro en sí y al nivel limitado de la persona, inevitablemente se producirán algunos errores. Si hay un error, espero que todos lo señalen y lo
discutiremos juntos.

referencia
"Algoritmo" Cuarta edición (https://book.douban.com/subject/19952400/)
Árbol rojo-negro - Wikipedia (https://en.wikipedia.org/wiki/Red%E2%80%93black_tree)

(http://creativecommons.org/licenses/by-nc-nd/4.0/)
Esta obra está autorizada bajo el Acuerdo de licencia internacional Creative Commons Reconocimiento-Uso no comercial-Sin deducción 4.0
(http://creativecommons.org/licenses/by-nc-nd/4.0/) .

Descargo de responsabilidad: este artículo de blog, a menos que se especifique lo contrario, utiliza el Acuerdo de
(http://creativecommons.org/licenses/by-nc-nd/4.0/) licencia internacional de atribución - No comercial - Sin obras derivadas 4.0 de Creative
Commons (http://creativecommons.org/licenses/by-nc-nd/4.0/) . ¡Indique la fuente!
  Anterior (/2018/01/11/TreeMap源码分析/)

Tian Xiaobo (https://github.com/code4wt)


No construyas plataformas altas sobre arena flotante

También podría gustarte