//Constructor con parametros public Nodo_Arbol(int nueva_info, Nodo_Arbol izquierdo, Nodo_Arbol derecho, Nodo_Arbol padre) { this.info = nueva_info; this.Izquierdo = izquierdo; this.Derecho = derecho; this.Padre = padre; altura = 0; }
//Constructor con parametros public Nodo_Arbol(int nueva_info, Nodo_Arbol subArbol, Nodo_Arbol padre) { this.info = nueva_info; this.subArboles.Add(subArbol); //this.Izquierdo = izquierdo; //this.Derecho = derecho; this.Padre = padre; altura = 0; }
//Funcion para calcular altura public int calcularAltura(Nodo_Arbol Raiz) { int h, h_aux; if (Raiz == null) return 0; h = 0; if (Raiz.Izquierdo != null) h = 1 + calcularAltura(Raiz.Izquierdo); if (Raiz.Derecho != null) { h_aux = 1 + calcularAltura(Raiz.Derecho); if (h_aux > h) h = h_aux; } return h; }
//Funcion para colorear los nodos public void colorear(Graphics grafo, Font fuente, Brush Relleno, Brush RellenoFuente, Pen Lapiz, Nodo_Arbol Raiz, bool post, bool inor, bool preor) { Brush entorno = Brushes.Red; if (inor == true) { if (Raiz != null) { colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Izquierdo, post, inor, preor); Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); Thread.Sleep(1000); // pausar la ejecución 1000 milisegundos Raiz.colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz); colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Derecho, post, inor, preor); } } else if (preor == true) { if (Raiz != null) { Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); Thread.Sleep(1000); // pausar la ejecución 1000 milisegundos Raiz.colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz); colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Izquierdo, post, inor, preor); colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Derecho, post, inor, preor); } } else if (post == true) { if (Raiz != null) { colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Izquierdo, post, inor, preor); colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Derecho, post, inor, preor); Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); Thread.Sleep(1000); // pausar la ejecución 1000 milisegundos Raiz.colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz); } } }
//Funcion para colorear los nodos public void colorear(Graphics grafo, Font fuente, Brush Relleno, Brush RellenoFuente, Pen Lapiz, Nodo_Arbol Raiz, bool post, bool inor, bool preor) { Brush entorno = Brushes.Red; if (inor == true) //Si es recorrido en orden { if (Raiz != null) //Si la raiz no es null { colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Izquierdo, post, inor, preor); //Se colorea el nodo izquiero Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); //Se colorea la raiz Thread.Sleep(1000); // pausar la ejecución 1000 milisegundos Raiz.colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz); //Se vuelve a colorear la raiz colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Derecho, post, inor, preor); //Se colorea el nodo derecho } } else if (preor == true) //Si es recorrido pre orden { if (Raiz != null) //Si la raiz no es null { Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); //Se colorea la raiz Thread.Sleep(1000); // pausar la ejecución 1000 milisegundos Raiz.colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz); //Se colorea la raiz colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Izquierdo, post, inor, preor); //Se colorea el nodo izquierdo colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Derecho, post, inor, preor); //Se colorea el nodo derecho } } else if (post == true) //Si es recorrido post orden { if (Raiz != null) //Si la raiz no es null { colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Izquierdo, post, inor, preor); //Se colorea el nodo izquiero colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Derecho, post, inor, preor); //Se colorea el nodo derecho Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); //Se colorea la raiz Thread.Sleep(1000); // pausar la ejecución 1000 milisegundos Raiz.colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz); //Se colorea la raiz } } }
//Final de la funcion Eliminar //Funcion para recorrer el Arbol Binario (busqueda de un nodo) public void buscar(int x, Nodo_Arbol t) { if (t != null) { if(x < t.info) { buscar(x, t.Izquierdo); } else { if (x > t.info) { buscar(x, t.Derecho); } else MessageBox.Show("El Nodo SI existe", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else { MessageBox.Show("Nodo NO Encontrado en el Arbol", "Error de Busqueda", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
//Constructor con parametros public Arbol_Binario(Nodo_Arbol nueva_raiz) { Raiz = nueva_raiz; }
//Constructor por defecto public Arbol_Binario() { aux = new Nodo_Arbol(); }
/* * * Funciones para la sumataria de valores del arbol * * */ //Funcion que suma los valores del arbol con un modulo especifico public void sumar(Graphics grafo, Font fuente, Brush Relleno, Brush RellenoFuente, Pen Lapiz, Nodo_Arbol Raiz, int modulo) { Nodo_Arbol actual = Raiz; Brush entorno = Brushes.Red; frmPrincipal myForm = new frmPrincipal(); if (Raiz != null) { sumar(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Izquierdo, modulo); if(Raiz.info%modulo == 0) { Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); } sumar(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Derecho, modulo); } }
//Funcion para calcular que nodo se ha tocado con el mouse y resaltarlo, regresa el valor del nodo public int seleccionar(Graphics grafo, Font fuente, Brush RellenoFuente, Pen Lapiz, Nodo_Arbol Raiz, Point Referencia) { Nodo_Arbol actual = Raiz; Brush entorno = Brushes.Red; while (actual != null) //Mientras el nodo actual no sea null { int diferenciaX = Referencia.X - actual.nodo.X; //Diferencia en X entre el puntero y el nodo actual int diferenciaY = Referencia.Y - actual.nodo.Y; //Diferencia en Y entre el puntero y el nodo actual if (diferenciaX > 0 && diferenciaX < 30 && diferenciaY > 0 && diferenciaY < 30) //0>x<30 y 0>y<30 Si el puntero esta a 30 px maximo del nodo { actual.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); //Se colorea el nodo actual return actual.info; //Se regresa el valor del nodo } else if (diferenciaX > 0) actual = actual.Derecho; //Si la diferencia en 'x' es mayor a 0 actual es el nodo derecho else if (diferenciaX < 0) actual = actual.Izquierdo; //Si la difrencia en 'x' es menor a 0 actual es el nodo izquierdo } return 100; }
//Funcion para hacer resaltar un nodo si es que existe public void resaltar(Graphics grafo, Font fuente, Brush Relleno, Brush RellenoFuente, Pen Lapiz, Nodo_Arbol Raiz, int x) { Nodo_Arbol actual = Raiz; Brush entorno = Brushes.Red; while (actual != null) //Mientras el nodo actual no sea null { if (x == actual.info) //Si el valor del nodo raiz es igual al actual { actual.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); //Se resalta el nodo coloreandolo break; } else if (x < actual.info) actual = actual.Izquierdo; else if (x > actual.info) actual = actual.Derecho; } }
//Funcion para agregar un nuevo nodo (valor) al Arbol Binario public void Insertar(int x) { if (Raiz == null) { Raiz = new Nodo_Arbol(x, null, null, null); Raiz.nivel = 0; } else { Raiz = Raiz.Insertar(x, Raiz, Raiz.nivel); } }
//Funcion para ver si existe un nodo en el Arbol Binario public bool existe(int x, Nodo_Arbol Raiz) { Nodo_Arbol actual = Raiz; while (actual != null) { if (x == actual.info) return true; else if (x < actual.info) actual = actual.Izquierdo; else if (x > actual.info) actual = actual.Derecho; } return false; }
//Funcion para eliminar un nodo del Arbol Binario public void Eliminar(int x, ref Nodo_Arbol t) { if (t != null) //Si la raiz es distinta de null { if (x < t.info) //Si el valor a eliminar es menor que la raiz { Eliminar(x, ref t.Izquierdo); } else { if (x > t.info) //Si el valor a eliminar es mayor que la raiz { Eliminar(x, ref t.Derecho); } else { Nodo_Arbol NodoEliminar = t; //Ya se ubico el nodo que se desea eliminar if (NodoEliminar.Derecho == null) //Se verifica si tiene hijo derecho { t = NodoEliminar.Izquierdo; } else { if (NodoEliminar.Izquierdo == null) //Se verifica si tiene hijo izquiero { t = NodoEliminar.Derecho; } else { if(Alturas(t.Izquierdo) - Alturas(t.Derecho) > 0) { //Para verificar que hijo pasa a ser nueva raiz del subarbol Nodo_Arbol AuxiliarNodo = null; Nodo_Arbol Auxiliar = t.Izquierdo; bool Bandera = false; while(Auxiliar.Derecho != null) { AuxiliarNodo = Auxiliar; Auxiliar = Auxiliar.Derecho; Bandera = true; } t.info = Auxiliar.info; //Se crea un nodo temporal NodoEliminar = Auxiliar; if(Bandera == true) { AuxiliarNodo.Derecho = Auxiliar.Izquierdo; } else { t.Izquierdo = Auxiliar.Izquierdo; } } else { if(Alturas(t.Derecho) - Alturas(t.Izquierdo) > 0) { Nodo_Arbol AuxiliarNodo = null; Nodo_Arbol Auxiliar = t.Derecho; bool Bandera = false; while(Auxiliar.Izquierdo != null) { AuxiliarNodo = Auxiliar; Auxiliar = Auxiliar.Izquierdo; Bandera = true; } t.info = Auxiliar.info; NodoEliminar = Auxiliar; if(Bandera == true) { AuxiliarNodo.Izquierdo = Auxiliar.Derecho; } else { t.Derecho = Auxiliar.Derecho; } } else { if (Alturas(t.Derecho) - Alturas(t.Izquierdo) == 0) { Nodo_Arbol AuxiliarNodo = null; Nodo_Arbol Auxiliar = t.Izquierdo; bool Bandera = false; while (Auxiliar.Derecho != null) { AuxiliarNodo = Auxiliar; Auxiliar = Auxiliar.Derecho; Bandera = true; } t.info = Auxiliar.info; NodoEliminar = Auxiliar; if (Bandera == true) { AuxiliarNodo.Derecho = Auxiliar.Izquierdo; } else { t.Izquierdo = Auxiliar.Izquierdo; } } } } } } } } } else { MessageBox.Show("Nodo NO Existe en el Arbol", "Error de Eliminacion", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
//Funcion para insertar un nodo en el Arbol Binario public Nodo_Arbol Insertar(int x, Nodo_Arbol t, int Level) { if (t == null) //Si no hay nodo raiz { t = new Nodo_Arbol(x, null, null, null); t.nivel = Level; } else if(x < t.info) //Si el valor a insertar es mayor que la raiz { Level++; t.Izquierdo = Insertar(x, t.Izquierdo, Level); } else if(x > t.info) //Sino si el valor es menor que la raiz { Level++; t.Derecho = Insertar(x, t.Derecho, Level); } else //Sino el dato ya existe en el arbol { MessageBox.Show("Dato Existente en el Arbol", "Error de ingreso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } return t; }
//Funcion para calcular que nodo se ha tocado con el mouse y resaltarlo, regresa el valor del nodo public int seleccionar(Graphics grafo, Font fuente, Brush RellenoFuente, Pen Lapiz, Nodo_Arbol Raiz, Point Referencia) { Nodo_Arbol actual = Raiz; Brush entorno = Brushes.Red; while (actual != null) { int diferenciaX = Referencia.X - actual.nodo.X; int diferenciaY = Referencia.Y - actual.nodo.Y; if (diferenciaX > 0 && diferenciaX < 30 && diferenciaY > 0 && diferenciaY < 30) { actual.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); return actual.info; } else if (diferenciaX > 0) actual = actual.Derecho; else if (diferenciaX < 0) actual = actual.Izquierdo; } return 100; }
//Funcion para hacer resaltar un nodo si es que existe public void resaltar(Graphics grafo, Font fuente, Brush Relleno, Brush RellenoFuente, Pen Lapiz, Nodo_Arbol Raiz, int x) { Nodo_Arbol actual = Raiz; Brush entorno = Brushes.Red; while (actual != null) { if (x == actual.info) { actual.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); break; } else if (x < actual.info) actual = actual.Izquierdo; else if (x > actual.info) actual = actual.Derecho; } }
//Funcion para calcular la altura de un nodo en el Arbol Binario private static int Alturas(Nodo_Arbol t) { return t == null ? -1 : t.altura; }
//Funcion para eliminar un nodo (valor) del Arbol Binario public void Eliminar(int x) { if (Raiz == null) { Raiz = new Nodo_Arbol(x, null, null, null); } else { Raiz.Eliminar(x, ref Raiz); } }
// Función para Colorear los nodos public void colorear(Graphics grafo, Font fuente, Brush Relleno, Brush RellenoFuente, Pen Lapiz, Nodo_Arbol Raiz, bool post, bool inor, bool preor) { Brush entorno = Brushes.Red; if (inor == true) { if (Raiz != null) { colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Izquierdo, post, inor, preor); Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); Thread.Sleep(1000); // pausar la ejecución 1000 milisegundos Raiz.colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz); colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Derecho, post, inor, preor); //valor += Raiz.Info + ", "; } } else if (preor == true) { if (Raiz != null) { Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); Thread.Sleep(1000); // pausar la ejecución 1000 milisegundos Raiz.colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz); colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Izquierdo, post, inor, preor); colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Derecho, post, inor, preor); //valor += Raiz.Info + ", "; } } else if (post == true) { if (Raiz != null) { colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Izquierdo, post, inor, preor); colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Derecho, post, inor, preor); Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); Thread.Sleep(1000); // pausar la ejecución 1000 milisegundos Raiz.colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz); //valor += Raiz.Info + ", "; } } else { /*colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Izquierdo, post, inor, * preor);*/ Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz); valor += Raiz.Info + ""; Thread.Sleep(1000); // pausar la ejecución 1000 milisegundos Raiz.colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz); /*colorear(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.Derecho, post, inor, * preor);*/ } }