Capítulo 13 "El árbol rojo-negro": una breve introducción al árbol rojo-negro

Árbol negro rojo

El árbol rojo-negro es un árbol de búsqueda binario, agrega un bit de almacenamiento a cada nodo para indicar el color del nodo, que puede ser ROJO o NEGRO. Cada nodo en el árbol contiene 5 atributos: color, clave, izquierda, derecha y p. Si un nodo no tiene hijo o padre, el valor del atributo de puntero correspondiente del nodo es NIL, y un árbol rojo-negro satisface el siguiente naturaleza roja y negra del árbol de búsqueda binaria:

  • Cada nodo es rojo o negro
  • El nodo raíz es negro
  • Cada nodo de hoja (NIL) es negro
  • Si un nodo es rojo, entonces sus dos nodos secundarios son negros.
  • Para cada nodo, la ruta simple desde ese nodo a todos sus nodos hoja descendientes contiene el mismo número de nodos negros.

La siguiente figura (a) muestra un árbol rojo-negro, y en la figura (b), en lugar de usar NIL uno por uno, se reemplaza por un centinela negro T.nil, y también se omite su altura negra. del nodo raíz es también este centinela.Solo
Inserte la descripción de la imagen aquí

Desde un nodo xxEl número de nodos negros en cualquier camino simple que comienza desde x (excluyendo este nodo) hasta un nodo hoja se llama la altura negra del nodo, denotado comobh (x) bh (x)b h ( x ) . De la naturaleza del árbol rojo-negro, un árbol tienennLa altura del árbol rojo-negro con n nodos internos es como máximo2 lg (n + 1) 2lg (n + 1)2 l g ( n+1 )

Vuelta

Las operaciones de árbol de búsqueda insertar y eliminar contienen nnEn un árbol rojo-negro con n palabras clave, el tiempo de ejecución esO (lgn) O (lgn)O ( l g n ) . Debido a que estas dos operaciones modifican el árbol, puede violar la naturaleza rojo-negro. Para mantener estas propiedades, se debe cambiar el color y la estructura del puntero de algunos nodos en el árbol. La modificación de la estructura del puntero se realiza mediante rotación (ratación), que es una operación local del árbol de búsqueda que puede mantener la naturaleza del árbol de búsqueda binario. Como se muestra en la figura siguiente, se dan dos tipos de rotación: izquierda y derecha. Mano izquierda axxx y y La cadena de y se realiza como un "pivote", lo que hace queyyy se convierte en el nuevo nodo raíz del subárbol,xxx se convierte enyytu hijo dejado,yyel hijo izquierdo de y se convierte enxxEl hijo correcto de x .
Inserte la descripción de la imagen aquí
Python implementa la rotación de la siguiente manera:

	#左旋转
	def left_rotate(self, x):
		# set y
		y = x.rchild
		# turn y left subtree into x right subtree
		x.rchild = y.lchild
		if y.lchild != self.nil:
			y.lchild.parent = x
		# link x parent to y
		y.parent = x.parent
		if x.parent == self.nil:
			# x is root
			self.root = y
		elif x == x.parent.lchild:
			x.parent.lchild = y
		else:
			x.parent.rchild = y
		# put x on y left
		y.lchild = x
		x.parent = y
	#右旋转
	def right_rotate(self, y):
		# set x
		x = y.lchild
		# turn x right subtree into y left subtree
		y.lchild = x.rchild
		if x.rchild != self.nil:
			x.rchild.parent = y
		# link y parent to x
		x.parent = y.parent
		if y.parent == self.nil:
			# x is root
			self.root = x
		elif y == y.parent.lchild:
			y.parent.lchild = x
		else:
			y.parent.rchild = x
		# put y on x right
		x.rchild = y
		y.parent = x

Supongo que te gusta

Origin blog.csdn.net/BGoodHabit/article/details/105927933
Recomendado
Clasificación