Está en la página 1de 14
Programación II - Material Explicativo Árboles Balanceados Versión 1.0 Abril 2007

Programación II - Material Explicativo

Árboles Balanceados

Versión 1.0

Abril 2007

1. Definiciones Breves (balanceo)

  • a. Arbol Perfectamente Balanceado

Sea W0-i-1 el peso el sub-árbol izquierdo el elemento i y Wi+1-n el peso del sub-arbol derecho de i Entonces un árbol está balanceado sii |W0i-1 - Wi+1-n| <= 1

  • b. Arbol AVL

Un árbol AVL está balanceado sii en cada nodo las alturas de sus sub-árboles difieren como máximo en 1

2. Notas

  • a. AVL – Creación de Adelson-Velski-Landis

  • b. Un árbol AVL tiene como máximo una altura 45% mayor que uno perfectamente balanceado

3. Pseudo-código

 

a.

BuscaInsBal

BuscaInsbal(clave: TClave; arbol : TArbolAVL) : Tbooleano Com

 

Si arbol.esVacio() // en caso de ser vacío no me importa el balance, directamente lo inserto nodoAInsertar : TNodo nodoAInsertar f crearNodo(clave) arbol.raiz f nodoAInsertar

Sino

 

BuscaInsBal(clave,arbol.raiz)

 

FinSi

Fin

 

b.

BuscaInsBal – Interno

BuscaInsbal(clave: TClave; nodoActual : TNodo) : TBooleano Com cambioAltura : TBooleano nuevoNodo, nodoEncontrado : TNodo Si nodoActual.clave = clave cambioAltura f falso

Sino

Si clave < nodoActual.clave Si nodoActual.HIz = nulo //termina la recursividad, inserto en el hijo izquierdo, tengo que ver si hay cambio de altura nuevoNodo = crearNodo(clave) nodoActual.Hiz = nuevoNodo verBalance(nodoActual, IZQUIERDA)

Si nodoActual.HDer = nulo //está cambiando la altura del sub-árbol actual cambioAltura f verdadero

 

Sino

cambioAltura f falso

FinSi

Sino

 

Si BuscaInsBal(clave, nodoActual.Hiz) //Inserté en el hijo izquierdo, y cambió la altura del mismo, tengo que balancear verBalance(nodoActual, IZQUIERDA)

FinSi

FinSi

Sino

 

Si nodoActual.HDer = nulo //termina la recursividad, inserto en el hijo derecho, tengo que ver si hay cambio de altura nuevoNodo = crearNodo(clave) nodoActual.HDer = nuevoNodo verBalance(nodoActual, DERECHA) Si nodoActual.HIzq = nulo //está cambiando la altura del sub-árbol actual cambioAltura f verdadero

Sino

cambioAltura f falso

FinSi

Sino

Si BuscaInsBal(clave, nodoActual.HDer) //Inserté en el hijo derecho, y cambió la altura del mismo, tengo que balancear verBalance(nodoActual, DERECHA)

FinSi

FinSi

Fin

Fin

c. VerBalance

VerBalance(nodoActual : TNodo, claveAVerificar : TClave) nodoHijo : TNodo Si claveAVerificar = IZQUIERDA dependiendo de nodoActual.balance

0,1: nodoActual.balance f nodoActual.balance – 1 //solamente tengo que encargarme de actualizar el balance

-1:

Com //rama izq era mayor y creció, hay que balancear nodoHijo f nodoActual.Hiz Si nodoHijo.balance = -1 RotaIzIz

SiNo

RotaIzDer

FinSi Fin nodoActual.balance f nodoActual.balance - 1

Sino

 

dependiendo de nodoActual.balance

0,-1: nodoActual.balance f nodoActual.balance + 1 //solamente tengo que encargarme de actualizar el balance

1:

 

Com //rama der era mayor y creció, hay que balancear nodoHijo f nodoActual.Der Si nodoHijo.balance = 1 RotaDerDer

SiNo

RotaDerIz

FinSi Fin nodoActual.balance f nodoActual.balance + 1

FinSi

Fin

d. Rotaciones

  • 1. I-I

RotaIzIz(nodoActual, nodoHijo : TNodo)

Com

 

nodoActual.HIz f nodoHijo.HDer nodoHijo.HDer f nodoActual nodoActual.balance f 0 nodoHijo.balance f 0 sustituir(nodoActual,nodoHijo)

Fin

  • 2. I-D

RotaIzDer(nodoActual, nodoHijo : TNodo) Com

nodoNieto : TNodo nodoNieto f nodoHijo.HDer nodoHijo.HDer f nodoNieto.HIz nodoNieto.HIz f nodoHijo nodoActual.HIz f nodoNieto.HDer nodoNieto.HDer f nodoActual //Actualizo el balance del nodoActual Si nodoNieto.balance = -1 nodoActual.balance f 1

Sino

nodoActual.balance f 0

FinSi //Actualizo el balance del nodoHijo Si nodoNieto.balance = 1 nodoHijo.balance f -1

Sino

nodoHijo.balance f 0

FinSi nodoNieto.balance f 0 sustituir(nodoActual,nodoNieto)

Fin

  • 3. D-D

RotaDerDer(nodoActual, nodoHijo : TNodo) Com

nodoActual.HDer f nodoHijo.HIzq nodoHijo.HIzq f nodoActual nodoActual.balance f 0 nodoHijo.balance f 0 sustituir(nodoActual,nodoHijo)

Fin

  • 4. D-I

RotaDerIz(nodoActual, nodoHijo : TNodo) Com

nodoNieto : TNodo nodoNieto f nodoHijo.HIzq nodoHijo.HIzq f nodoNieto.HDer nodoNieto.HDer f nodoHijo nodoActual.HDer f nodoNieto.HIzq nodoNieto.HIzq f nodoActual //Actualizo el balance del nodoActual Si nodoNieto.balance = 1 nodoActual.balance f -1

Sino nodoActual.balance f 0 FinSi //Actualizo el balance del nodoHijo

Si nodoNieto.balance = -1 nodoHijo.balance f 1

Sino

nodoHijo.balance f 0

FinSi nodoNieto.balance f 0 sustituir(nodoActual,nodoNieto)

Fin

4. Ejemplos Gráficos

a. RR

  • 1. Situación Anterior

5 1 4 8 0 0 6 10 0 0
5
1
4
8
0
0
6
10
0
0

Se procede a insertar la clave “9”

2.

Cómo quedaría el árbol sin balanceo

5 2 4 8 1 0 6 10 0 -1 9 0
5
2
4
8
1
0
6
10
0
-1
9
0

3.

Luego del balanceo

8 0 5 10 0 -1 4 4 6 9 0 0 0 0
8
0
5
10
0
-1
4
4
6
9
0 0
0
0

b. RL

  • 1. Situación anterior

8 1 6 15 0 0 13 20 0 0
8
1
6
15
0
0
13
20
0
0

Se procede a insertar la clave “10”

2.

Cómo quedaría el árbol sin balanceo

8 2 6 15 -1 0 13 20 -1 0 10 0
8
2
6
15
-1
0
13
20
-1
0
10
0

3.

Luego del balanceo

13 0 8 15 1 0 6 10 20 0 0 0
13
0
8
15
1
0
6
10
20
0
0
0