// Constructor. public A_AVL(int valorNuevo, A_AVL izquierdo, A_AVL derecho, A_AVL padre) { valor = valorNuevo; NodoIzquierdo = izquierdo; NodoDerecho = derecho; NodoPadre = padre; altura = 0; }
//Rotacion Derecha Simple private static A_AVL RotacionDerechaSimple(A_AVL k1) { A_AVL k2 = k1.NodoDerecho; k1.NodoDerecho = k2.NodoIzquierdo; k2.NodoIzquierdo = k1; k1.altura = max(Alturas(k1.NodoIzquierdo), Alturas(k1.NodoDerecho)) + 1; k2.altura = max(Alturas(k2.NodoDerecho), k1.altura) + 1; return(k2); }
//Eliminar un valor del arbol public void Eliminar(int dato) { if (Raiz == null) { Raiz = new A_AVL(dato, null, null, null); } else { Raiz.Eliminar(dato, ref Raiz); } }
// Agrega un nuevo valor al arbol. public void Insertar(int dato) { if (Raiz == null) { Raiz = new A_AVL(dato, null, null, null); } else { Raiz = Raiz.Insertar(dato, Raiz); } }
//Funcion para obtener la altura del arbol public int getAltura(A_AVL nodoActual) { if (nodoActual == null) { return(0); } else { return(1 + Math.Max(getAltura(nodoActual.NodoIzquierdo), getAltura(nodoActual.NodoDerecho))); } }
//Funcion para insertar un nuevo valor en el arbol AVL public A_AVL Insertar(int valorNuevo, A_AVL Raiz) { if (Raiz == null) { Raiz = new A_AVL(valorNuevo, null, null, null); } else if (valorNuevo < Raiz.valor) { Raiz.NodoIzquierdo = Insertar(valorNuevo, Raiz.NodoIzquierdo); } else if (valorNuevo > Raiz.valor) { Raiz.NodoDerecho = Insertar(valorNuevo, Raiz.NodoDerecho); } else { MessageBox.Show("Valor Existente en el Arbol", "Error", MessageBoxButtons.OK); } //Realiza las rotaciones simples o dobles segun el caso if (Alturas(Raiz.NodoIzquierdo) - Alturas(Raiz.NodoDerecho) == 2) { if (valorNuevo < Raiz.NodoIzquierdo.valor) { Raiz = RotacionIzquierdaSimple(Raiz); } else { Raiz = RotacionIzquierdaDoble(Raiz); } } if (Alturas(Raiz.NodoDerecho) - Alturas(Raiz.NodoIzquierdo) == 2) { if (valorNuevo > Raiz.NodoDerecho.valor) { Raiz = RotacionDerechaSimple(Raiz); } else { Raiz = RotacionDerechaDoble(Raiz); } } Raiz.altura = max(Alturas(Raiz.NodoIzquierdo), Alturas(Raiz.NodoDerecho)) + 1; return(Raiz); }
//Buscar un valor en el arbol public void buscar(int valorBuscar, A_AVL Raiz) { if (Raiz != null) { if (valorBuscar < Raiz.valor) { buscar(valorBuscar, Raiz.NodoIzquierdo); } else { if (valorBuscar > Raiz.valor) { buscar(valorBuscar, Raiz.NodoDerecho); } } } else { MessageBox.Show("Valor no encontrado", "Error", MessageBoxButtons.OK); } }
public void colorearB(Graphics grafo, Font fuente, Brush Relleno, Brush RellenoFuente, Pen Lapiz, A_AVL Raiz, int busqueda) { Brush entorno = Brushes.Red; if (Raiz != null) { Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); if (busqueda < Raiz.valor) { Thread.Sleep(500); Raiz.colorear(grafo, fuente, entorno, Brushes.Blue, Lapiz); colorearB(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.NodoIzquierdo, busqueda); } else { if (busqueda > Raiz.valor) { Thread.Sleep(500); Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); colorearB(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.NodoDerecho, busqueda); } else { Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); Thread.Sleep(500); } } } }
public A_DibujarAVL(A_AVL RaizNueva) { Raiz = RaizNueva; }
// Constructor. public A_DibujarAVL() { aux = new A_AVL(); }
public A_AVL Eliminar(int valorEliminar, ref A_AVL Raiz) { if (Raiz != null) { if (valorEliminar < Raiz.valor) { nodoE = Raiz; Eliminar(valorEliminar, ref Raiz.NodoIzquierdo); } else { if (valorEliminar > Raiz.valor) { nodoE = Raiz; Eliminar(valorEliminar, ref Raiz.NodoDerecho); } else { //Posicionado sobre el elemento a eliminar A_AVL NodoEliminar = Raiz; if (NodoEliminar.NodoDerecho == null) { Raiz = NodoEliminar.NodoIzquierdo; if (Alturas(nodoE.NodoIzquierdo) - Alturas(nodoE.NodoDerecho) == 2) { //MessageBox.Show("nodoE" + nodoE.valor.ToString()); if (valorEliminar < nodoE.valor) { nodoP = RotacionIzquierdaSimple(nodoE); } else { nodoE = RotacionDerechaSimple(nodoE); } } if (Alturas(nodoE.NodoDerecho) - Alturas(nodoE.NodoIzquierdo) == 2) { if (valorEliminar > nodoE.NodoDerecho.valor) { nodoE = RotacionDerechaSimple(nodoE); } else { nodoE = RotacionDerechaDoble(nodoE); nodoP = RotacionDerechaSimple(nodoE); } } } else { if (NodoEliminar.NodoIzquierdo == null) { Raiz = NodoEliminar.NodoDerecho; } else { if (Alturas(Raiz.NodoIzquierdo) - Alturas(Raiz.NodoDerecho) > 0) { A_AVL AuxiliarNodo = null; A_AVL Auxiliar = Raiz.NodoIzquierdo; bool Bandera = false; while (Auxiliar.NodoDerecho != null) { AuxiliarNodo = Auxiliar; Auxiliar = Auxiliar.NodoDerecho; Bandera = true; } Raiz.valor = Auxiliar.valor; NodoEliminar = Auxiliar; if (Bandera == true) { AuxiliarNodo.NodoDerecho = Auxiliar.NodoIzquierdo; } else { Raiz.NodoIzquierdo = Auxiliar.NodoIzquierdo; } //Realiza las rotaciones simples o dobles segun el caso } else { if (Alturas(Raiz.NodoDerecho) - Alturas(Raiz.NodoIzquierdo) > 0) { A_AVL AuxiliarNodo = null; A_AVL Auxiliar = Raiz.NodoDerecho; bool Bandera = false; while (Auxiliar.NodoIzquierdo != null) { AuxiliarNodo = Auxiliar; Auxiliar = Auxiliar.NodoIzquierdo; Bandera = true; } Raiz.valor = Auxiliar.valor; NodoEliminar = Auxiliar; if (Bandera == true) { AuxiliarNodo.NodoIzquierdo = Auxiliar.NodoDerecho; } else { Raiz.NodoDerecho = Auxiliar.NodoDerecho; } } else { if (Alturas(Raiz.NodoDerecho) - Alturas(Raiz.NodoIzquierdo) == 0) { A_AVL AuxiliarNodo = null; A_AVL Auxiliar = Raiz.NodoIzquierdo; bool Bandera = false; while (Auxiliar.NodoDerecho != null) { AuxiliarNodo = Auxiliar; Auxiliar = Auxiliar.NodoDerecho; Bandera = true; } Raiz.valor = Auxiliar.valor; NodoEliminar = Auxiliar; if (Bandera == true) { AuxiliarNodo.NodoDerecho = Auxiliar.NodoIzquierdo; } else { Raiz.NodoIzquierdo = Auxiliar.NodoIzquierdo; } } } } } } } } } else { MessageBox.Show("Nodo inexistente en el arbol", "Error", MessageBoxButtons.OK); } return(nodoP); }
private static int Alturas(A_AVL Raiz) { return(Raiz == null ? -1 : Raiz.altura); }
//Doble Rotacion Derecha private static A_AVL RotacionDerechaDoble(A_AVL k1) { k1.NodoDerecho = RotacionIzquierdaSimple(k1.NodoDerecho); return(RotacionDerechaSimple(k1)); }
//Doble Rotacion Izquierda private static A_AVL RotacionIzquierdaDoble(A_AVL k3) { k3.NodoIzquierdo = RotacionDerechaSimple(k3.NodoIzquierdo); return(RotacionIzquierdaSimple(k3)); }