La naturaleza del árbol de búsqueda binaria:
1,Todos los nodos del subárbol izquierdoEl valor de es menor o igual que el valor de su nodo raíz.
2,Todos los nodos del subárbol derechoEl valor de es mayor o igual que el valor de su nodo raíz.
Naturaleza máxima del montón:
1,Todos los nodos en los dos subárbolesEl valor de no es mayor que el valor de su nodo raíz.
1. Predecesor y sucesor:
actuando en un árbol binarioCruce de orden medio (no orden de capa), El orden después del recorrido, el nodo anterior del nodo actual es el nodo predecesor de este nodo; el siguiente nodo del nodo actual es el nodo sucesor de este nodo.
1.1 Para el árbol de búsqueda binaria:
nodos x
nodo predecesor: menor que el x.key
nodo clave más grande (15 precursor precursor precursor precursor 4,7 6,17 6) es;
nodos x
sucesores del nodo: mayor que x.key
el nodo clave más pequeño (6 El sucesor de 7, 7, el sucesor de 9, el sucesor de 13 15); el
pseudocódigo sucesor:
int TreeSuccessor(node x)
{
if(x.right != NULL) return Tree_minmum(x.right);
y = x.p;
while(y!=NULL && x ==y.right){
//若x为右节点,则后继为最低的祖先且其左孩子也是祖先(13的后继15)
x = y;
y = y.p;
}
return y; //若x为左节点,则返回父节点
}
2. Inserción y eliminación:
2.1. Inserción:
El nodo recién insertado es siempre un nodo hojaPor lo tanto, la posición adecuada encontrada está vacía y el nodo principal del nodo vacío se registra para su inserción.
Insertar pseudocódigo:
void TreeInsert(Tree T, node z)
{
y = NULL;
x = T.root; //x用于找位置指导为空即找到,y为x的父节点
while(x != NULL){
y = x;
if(z.key<x.key){
x = x.left;
}else{
x = x.right;
}
}
z.p = y;
if(y == NULL){
// 树为空
T.root = z;
}
else if (z.key<y.key){
y.left = z;
}
else{
y.right = z;
}
}
13 se inserta debajo de 15:
2.2. Eliminar: Hay
tres situaciones:
a) Situación simple: hay solo un niño o ningún niño, entoncesReemplazar con otro niño o NULLz
b) Situación complicada: Hay dos hijos, divididos en dos situaciones, sea el hijo adecuado el sucesor o no.
Propósito: El reemplazo z
es su sucesor y
( z
valor mínimo mayor que )
b1) El hijo adecuado es su sucesor:y
Reemplazar con sucesorz
El hijo derecho es el sucesor (mayor que su mínimo), lo que indica que el hijo derecho no tiene hijo izquierdo.
b2) El hijo adecuado no es su sucesor:Con un sucesor y
en su lugar el derecho del niño y
, en y
lugar dez
Código falso:
// v数代替u树的小函数
void Transplant(Tree T, node u,node v)
{
if(u.p = NULL) t.root = v;
else if(u = u.p.left) u.p.left = v;
else u.p.right = v;
if(v != NULL) v.p = u.p;
}
Función Eliminar nodo:
** Referencia: ** Introducción al algoritmo: Sección 12.2 Consultar árbol de búsqueda binaria y Sección 12.3 Insertar y eliminar
para resumir:
1. La naturaleza del árbol de búsqueda binaria: todos los nodos del subárbol izquierdo son más pequeños que el nodo raíz (el subárbol derecho es mayor que).
2. Predecesor y sucesor se refieren a los nodos después del recorrido en orden.
3. El sucesor (predecesor) del árbol de búsqueda binaria es el nodo más pequeño (más grande) mayor que (menor que) el nodo.
4. El nodo recién insertado en el árbol de búsqueda binaria es siempre un nodo hoja, comenzando desde el nodo raíz y comparándolo con el nodo hoja vacío. (No es lo mismo que insertar un nodo en el montón. El montón se coloca primero al final del montón y luego se compara con el nodo raíz, se mueve hacia arriba si es más grande).
5. Eliminar del árbol de búsqueda binaria: si solo hay un hijo o ningún hijo, reemplace el nodo eliminado con otro hijo o NULL z
; si hay dos hijos, reemplace el nodo eliminado con su sucesor.
6. El tiempo de las operaciones básicas (insertar, eliminar, predecesor, sucesor, máximo, mínimo) en el árbol de búsqueda binaria es proporcional a la altura del árbol, porque la altura esperada es lg (n), por lo tanto,Tiempo medio de funcionamientoEs lg (n).
7. Árboles rojos y negrosPeor tiempo de ejecuciónEs lg (n).