Professional Documents
Culture Documents
INTRODUCCION
Los AB, son eficientes en las operaciones de bsqueda, insercin y eliminacin pero que sucede cuando El rbol crece o decrece descontroladamente, la eficiencia de la estructura de datos decae, Una situacin critica es cuando se insertan elementos ordenados en un AB
18
se crean rboles BB donde los tiempos de bsqueda son lineales (Similar al de arreglos o listas) 9
11
30
60
ARBOLES AVL
CUAL ES LA IDEA
Realizar reacomodos o balanceos despus de inserciones o eliminaciones de elementos. Se les conoce igual como arboles AVL(autores: 2 matemticos rusos G.M. Adelson-Velskii y E.M Landis).
CONCEPTO:
Es un rbol binario de bsqueda , en la cual se cumple la siguiente condicin Para todo nodo O raz del rbol la altura de los sub arboles izquierdo(sai) y derecho(sad) no deben diferir en ms de una unidad .
20
40
40
90
15
25 De altura 3
37
45
45 75
97
10
18
27
68 De altura 4
Factor de Equilibrio
El Factor de Equilibrio (FE) o de Balance (FB) de un nodo se define como la altura del SAD menos la altura del SAI correspondiente. El Factor de Equilibrio de cada nodo en un rbol balanceado ser 1, 1 0. Si FE llegara a tomar los valores de 2 2, entonces debera reestructurarse el rbol.
4 7
2 9 1
n1
n2
n1
S3 S1
S1
S2
S2
S3
Despus de la rotacin se sigue cumpliendo: S1 < n1 < S2 < n2 < S3 10 Notar que los nodos que rotan son el n1 y n2, y se reordena S2
Se tiene el siguiente rbol AVL. La altura de los hijos izquierdo y derecho en todos los nodos difieren a lo sumo en 1. Agreguemos el elemento 3 Al verificar si los nodos de la rama cumplen con la propiedad AVL, se determina que la raz no est desbalanceada. Se efecta la rotacin con los dos ltimos nodos de la rama involucrada en el desbalance.
6
No est Balanceado
No est Balanceado
Est Balanceado 8
5 2 Est Balanceado 3
Cuando en la trayectoria se encuentra un nodo desbalanceado, se procede a su balanceo mediante12 una rotacin.
13
2 1
No est Balanceado
2
Rotacin derecha
3
14
No est Balanceado
4
Rotacin derecha
15
No est Balanceado
4 2
Rotacin derecha
6
16
7
4
No est Balanceado
6
Rotacin derecha
17
15
14
13
12
11
10
No est Balanceado
15
14
Considerando los tres ltimos nodos en la trayectoria de la verificacin del desbalance, una rotacin simple no soluciona el desbalance. 18 En estos casos corresponde hacer una doble rotacin.
(Rotacin doble )
Considerando los tres ltimos nodos en la trayectoria de verificacin, si stos no estn el lnea recta, entonces se debe efectuar una rotacin doble.
Rotacin Izquierda
Rotacin Derecha
Rotacin Derecha
Rotacin Izquierda
19
20
Regresando al ejemplo
1 2 3 4 5 6 7 15 14 13
4
12
11
10
15
14
15
15 4
14 6
15
14
21
15
12
4
11
10
2 4 1 2 6 15 5
No est Balanceado
14 14
15
13 4
15
13 1 15 6 14
22
13
15
No est Balanceado
Rotacin derecha
2 14 1 5 13 15 3 5 4
14
13
15
12
12
23
14
Rotacin izquierda
14
13
2 15 No est Balanceado
12
15
12
11
13
11
24
14
12
12
14
11
13
1 0
13
15
1 0
25
12
Rotacin izquierda
12
11
2 14 No est Balanceado
1 0 9 11 13
14
1 0 9
13
15
15
26
12
1 0 9 11 13
14
15
27
Implementacin
public class CArbolAVL : CArbolBB { //=========== Constructores ================== public CArbolAVL() : base() { } /* ----------------------------------------- */ public CArbolAVL( CArbolBB pSubArbolIzq, Object pRaiz, CArbolBB pSubArbolDer) : base(pSubArbolIzq, pRaiz, pSubArbolDer) { }
28
//============ Metodos =============== private bool EstaBalanceado() { int Altura1 = (SubArbolIzq==null ? 0 : 1+SubArbolIzq.Altura()); int Altura2 = (SubArbolDer==null ? 0 : 1+SubArbolDer.Altura()); return (Math.Abs(Altura1-Altura2)<2); } /* ------------------------------------------- */ protected void RotacionSimpleIzq() { // La rotacin se efectuara primero creando un nuevo arbol y // reordenando los enlaces de los arboles SubArbolDer = new CArbolAVL(SubArbolIzq.SubArbolDer, Raiz,SubArbolDer); Raiz = SubArbolIzq.Raiz; SubArbolIzq = SubArbolIzq.SubArbolIzq; }
29
/* -------------------------------------------- */ protected void RotacionDobleIzq() { ((CArbolAVL)SubArbolIzq).RotacionSimpleDer(); RotacionSimpleIzq(); } /* -------------------------------------------- */ protected void RotacionSimpleDer() { // La rotacin se efectuara primero creando un nuevo arbol y // reordenando los enlaces de los arboles SubArbolIzq = new CArbolAVL(SubArbolIzq,Raiz, SubArbolDer.SubArbolIzq); Raiz = SubArbolDer.Raiz; SubArbolDer = SubArbolDer.SubArbolDer; }
30
/* -------------------------------------------- */ protected void RotacionDobleDer() { ((CArbolAVL)SubArbolDer).RotacionSimpleIzq(); RotacionSimpleDer(); } /* -------------------------------------------- */ public override void Agregar(object Elemento) { if (Raiz == null) Raiz = Elemento; else //agregar en alguno de los hijos
31
if (Elemento.ToString().CompareTo(Raiz.ToString())<0) { // Agregar el nuevo elemento como hijo Izq if (SubArbolIzq == null) SubArbolIzq= CArbolAVL.CrearAVL(null,Elemento,null); else SubArbolIzq.Agregar(Elemento); // Balancear arbol si esta desbalanceado if (!EstaBalanceado()) if (Elemento.ToString().CompareTo (SubArbolIzq.Raiz.ToString())<0) RotacionSimpleIzq(); else RotacionDobleIzq(); } FALTA, DEBE COMPLETAR USTED }
32