public NodoArbol() { derecho = null; izquierdo = null; }
public NodoLista(NodoArbol arbol, string nombre) { this.Arbol = arbol; this.Nombre = nombre; }
public bool Vacio(NodoArbol r) { return(r == null); }
/// <summary> /// Menu para arboles que no contienen datos enteros /// </summary> /// <param name="node">Arbol el cual se va manipular</param> /// <param name="nombre">nombre del arbol para mostrar al usuario</param> static public void MenuMostrar_C1(NodoArbol node, string nombre) { bool rep = false; do { Console.Clear(); Console.Title = $"Arbol {nombre}"; Console.WriteLine("1.- Mostrar Datos del Arbol"); Console.WriteLine("2.- Recorrido PreOrden"); Console.WriteLine("3.- Recorrido InOrden"); Console.WriteLine("4.- Recorrido PostOrden"); Console.WriteLine("5.- Salir del menu actual"); Console.WriteLine("6.- Salir del programa"); try { switch (int.Parse(Console.ReadLine())) { case 1: ABB.Transversa(node); System.Threading.Thread.Sleep(2000); rep = true; break; case 2: Recorridos.PreOrden(node); System.Threading.Thread.Sleep(2000); rep = true; break; case 3: Recorridos.InOrden(node); System.Threading.Thread.Sleep(2000); rep = true; break; case 4: Recorridos.PostOrden(node); System.Threading.Thread.Sleep(2000); rep = true; break; case 5: rep = false; break; case 6: Environment.Exit(0); break; default: Console.WriteLine("Elija una opcion valida"); rep = true; break; } } catch (System.FormatException) { Console.WriteLine("Ingrese un valor numerico"); rep = true; } } while (rep); }
/// <summary> /// Menu en caso de todos los datos del arbol sean enteros /// </summary> /// <param name="node">Arbol el cual se va manipular</param> /// <param name="nombre">nombre del arbol para mostrar al usuario</param> static public void MenuMostrar_C2(ref NodoArbol node, string nombre) { bool rep = false; do { Console.Clear(); Console.Title = $"Arbol {nombre}"; Console.WriteLine("1.- Mostrar Datos del Arbol"); Console.WriteLine("2.- Insertar nodo"); Console.WriteLine("3.- Eliminar nodo"); Console.WriteLine("4.- Buscar nodo en el arbol"); Console.WriteLine("5.- Buscar padre"); Console.WriteLine("6.- Recorrido PreOrden"); Console.WriteLine("7.- Recorrido InOrden"); Console.WriteLine("8.- Recorrido PostOrden"); Console.WriteLine("9.- Salir del Menu Actual"); Console.WriteLine("10.- Salir del Programa"); try { switch (int.Parse(Console.ReadLine())) { case 1: Console.Clear(); ABB.Transversa(node); System.Threading.Thread.Sleep(2000); rep = true; break; case 2: var valor = MenuInsercionInt(); node = ABB.Insertar(valor, node); rep = true; break; case 3: Console.WriteLine("Que valor desea eliminar?"); ABB.BorrarNodo(int.Parse(Console.ReadLine()), node); rep = true; break; case 4: Console.Clear(); Console.Write("Valor a buscar: \t"); int valor2 = int.Parse(Console.ReadLine()); if (Recorridos.Resultado_Buscar(node, valor2)) { NodoArbol nodoBuscado = Recorridos.Buscar(node, valor2); string mensaje = $"El elemento {nodoBuscado.Valor} si existe; "; if (nodoBuscado.Izq != null) { mensaje += $"su hijo izquierdo es {nodoBuscado.Izq.Valor}"; } else { mensaje += "su hijo izquierdo es null"; } if (nodoBuscado.Der != null) { mensaje += $", su hijo derecho es {nodoBuscado.Der.Valor}"; } else { mensaje += $", su hijo derecho es null"; } Console.WriteLine(mensaje); } else { Console.WriteLine("El elemento no existe"); } Console.ReadKey(); rep = true; break; case 5: Console.Clear(); Console.Write("Valor a evaluar: \t"); int valor3 = int.Parse(Console.ReadLine()); if (Recorridos.Resultado_Buscar(node, valor3)) { NodoArbol result = ABB.BuscarPadre(valor3, node); if (result == null) { Console.WriteLine($"El valor {valor3} es la raiz"); } else { Console.WriteLine($"El padre de {valor3} es {result.Valor}"); } } else { Console.WriteLine("El elemento no existe"); } Console.ReadKey(); rep = true; break; case 6: Recorridos.PreOrden(node); System.Threading.Thread.Sleep(2000); rep = true; break; case 7: Recorridos.InOrden(node); System.Threading.Thread.Sleep(2000); rep = true; break; case 8: Recorridos.PostOrden(node); System.Threading.Thread.Sleep(2000); rep = true; break; case 9: rep = false; break; case 10: Environment.Exit(0); break; default: Console.WriteLine("Ingrese una opcion valida"); rep = true; break; } } catch (System.FormatException) { Console.WriteLine("Ingrese un valor numerico"); } } while (rep); }
public System.IO.TextWriter semantError(NodoArbol t, String mensaje) { errorStream.WriteLine("Error en línea " + t.Linea + ":" + t.Columna + ": " + mensaje); return(semantError()); }
public void Eliminar(String nickname) { NodoArbol n = Buscar(nickname, Raiz); if (n != null) { if (n.Der == null && n.Izq == null) { if (n == this.Raiz) { this.Raiz = null; } else { if (n.Padre.Der == n) { n.Padre.Der = null; } else { n.Padre.Izq = null; } } } else if (n.Der == null && n.Izq != null) { if (n.Padre == null) { this.Raiz = n.Izq; } else { if (n.Padre.Der == n) { n.Padre.Der = n.Izq; } else { n.Padre.Izq = n.Izq; } } } else if (n.Der != null & n.Izq == null) { if (n.Padre == null) { this.Raiz = n.Der; } else { if (n.Padre.Der == n) { n.Padre.Der = n.Der; } else { n.Padre.Izq = n.Der; } } } else { //AMBOS NODOS ESTAN LLENOS NodoArbol aux = n.Der; while (aux.Izq != null) { aux = aux.Izq; } if (aux.Der != null) { if (aux.Padre != n) { aux.Padre.Izq = aux.Der; aux.Der.Padre = aux.Padre; } else { aux.Padre.Der = aux.Der; aux.Der.Padre = aux.Padre; } } else { if (aux.Padre != n) { aux.Padre.Izq = null; } else { aux.Padre.Der = null; } } //Si es la Raiz if (n.Padre == null) { Raiz = aux; aux.Padre = null; aux.Izq = n.Izq; aux.Der = n.Der; if (n.Izq != null) { n.Izq.Padre = aux; } if (n.Der != null) { n.Der.Padre = aux; } } else { aux.Izq = n.Izq; aux.Der = n.Der; if (n.Izq != null) { n.Izq.Padre = aux; } if (n.Der != null) { n.Der.Padre = aux; } if (n.Padre.Der == n) { n.Padre.Der = aux; } else { n.Padre.Izq = aux; } } } } }
public System.IO.TextWriter semantError(NodoArbol t) { errorStream.WriteLine(t.Linea + ":" + t.Columna + ": "); return(semantError()); }
public void Eliminar(string nuevaLlave) { NodoArbol <T> anterior = null, actual; actual = raiz; while (actual != null) { if (actual.Llave == nuevaLlave) { break; } anterior = actual; if (nuevaLlave.CompareTo(actual.Llave) == -1) { actual = actual.izquierda; } else { actual = actual.derecha; } } if (actual.izquierda == null && actual.derecha == null) { if (nuevaLlave.CompareTo(anterior.Llave) == -1) { anterior.izquierda = null; } else { anterior.derecha = null; } } else if (actual.izquierda != null || actual.derecha != null) { if (actual.izquierda != null) { if (nuevaLlave.CompareTo(anterior.Llave) == -1) { anterior.izquierda = actual.izquierda; } else { anterior.derecha = actual.izquierda; } } else { if (nuevaLlave.CompareTo(anterior.Llave) == -1) { anterior.izquierda = actual.derecha; } else { anterior.derecha = actual.derecha; } } } else { NodoArbol <T> temp = new NodoArbol <T>(); temp = actual.derecha; while (temp.izquierda != null) { anterior = temp; temp = temp.izquierda; } actual = temp; if (temp.izquierda != null) { if (nuevaLlave.CompareTo(anterior.Llave) == -1) { anterior.izquierda = temp.izquierda; } else { anterior.derecha = temp.izquierda; } } else { if (nuevaLlave.CompareTo(anterior.Llave) == -1) { anterior.izquierda = temp.derecha; } else { anterior.derecha = temp.derecha; } } } //Metodo de busqueda por ID que se obtenga de la lista NodoArbol <T> Buscar(int identificador, NodoArbol <T> r) { if (raiz == null) { return(null); } else if (r.Id != identificador) { return(r); } else if (r.Id < identificador) { return(Buscar(identificador, r.derecha)); } else { return(Buscar(identificador, r.izquierda)); } } }
public ArbolAVL() { raiz = null; }
//procedimiento recursivo que genera el arbol private void generar(NodoArbol nodoActual) { //Valido nodos nulos para evitar incluir condicionales en generacion de nodos cuando es nulo if (nodoActual == null) { return; } if (nodoActual.GetType() == typeof(Programa)) { Programa n = (Programa)nodoActual; generar(n.Sentencias); } else if (nodoActual.GetType() == typeof(ListaSentencia)) { ListaSentencia ls = (ListaSentencia)nodoActual; foreach (Sentencia sent in ls.getLista()) { generar(sent); } } else if (nodoActual.GetType() == typeof(Condicional)) { Emit.LocalBuilder tmpVarLogico; Condicional n = (Condicional)nodoActual; generar(n.Condicion); this.il.Emit(Emit.OpCodes.Ldc_I4_0); //Ingreso constante 0 this.il.Emit(Emit.OpCodes.Ceq); //Comparo si es falso (es 0) //Almaceno este resultado en una variable temporal tmpVarLogico = this.il.DeclareLocal(typeof(bool)); this.il.Emit(Emit.OpCodes.Stloc, tmpVarLogico); //cargo el resultado de la variable temporal this.il.Emit(Emit.OpCodes.Ldloc, tmpVarLogico); Emit.Label bloqueFalso = this.il.DefineLabel(); //salto en caso que sea verdadero el resultado es decir es cero la evaluacion del (pila==0) hago el sino this.il.Emit(Emit.OpCodes.Brtrue, bloqueFalso); generar(n.Entonces); Emit.Label finSi = this.il.DefineLabel(); this.il.Emit(Emit.OpCodes.Br, finSi); this.il.MarkLabel(bloqueFalso); generar(n.Sino); this.il.MarkLabel(finSi); } else if (nodoActual.GetType() == typeof(RepitaHasta)) { RepitaHasta n = (RepitaHasta)nodoActual; Emit.LocalBuilder tmpCondicion; tmpCondicion = this.il.DeclareLocal(typeof(bool)); Emit.Label sentenciasRepita = this.il.DefineLabel(); this.il.MarkLabel(sentenciasRepita); this.il.Emit(Emit.OpCodes.Nop); //emito primera sentencia vacia generar(n.Sentencias); generar(n.Condicion); this.il.Emit(Emit.OpCodes.Stloc, tmpCondicion); //almaceno resultado de condicion del mientras this.il.Emit(Emit.OpCodes.Ldloc, tmpCondicion); //cargo resultado de condicion del mientras this.il.Emit(Emit.OpCodes.Brfalse, sentenciasRepita); } else if (nodoActual.GetType() == typeof(Asignacion)) { Asignacion n = (Asignacion)nodoActual; generar(n.Expr); Almacenar(n.Id.Nombre.Texto, this.il); } else if (nodoActual.GetType() == typeof(LLamadaFuncion)) //Leer, Escribir { LLamadaFuncion n = (LLamadaFuncion)nodoActual; List <FuncionDef> funs = NucleoLenguaje.Instancia.getFuncBasicas(); //En la lista de definiciones de funciones estandar busco la definicion de la llamada para funcion deseada foreach (FuncionDef fun in funs) { if (n.Id.Texto.Equals(fun.Nombre.Texto)) { fun.ejecutarMetodo(il, n.Params); } } } else if (nodoActual.GetType() == typeof(NumeroEntero)) { NumeroEntero n = (NumeroEntero)nodoActual; this.il.Emit(Emit.OpCodes.Ldc_I4, convertir_a_entero(n.Token.Texto)); } else if (nodoActual.GetType() == typeof(Variable)) { Variable n = (Variable)nodoActual; if (!TablaDireccionesSimbolos.ContainsKey(n.Nombre.Texto)) { throw new System.Exception("ERROR-0008 fallo en analisis semantico Variable no declarada encontrada durante generacion '" + n.Nombre.Texto + "'"); } else { this.il.Emit(Emit.OpCodes.Ldloc, TablaDireccionesSimbolos[n.Nombre.Texto]); } } else if (nodoActual.GetType() == typeof(Suma)) { Suma n = (Suma)nodoActual; generar(n.ExprIzq); generar(n.ExprDer); this.il.Emit(Emit.OpCodes.Add); } else if (nodoActual.GetType() == typeof(Resta)) { Resta n = (Resta)nodoActual; generar(n.ExprIzq); generar(n.ExprDer); this.il.Emit(Emit.OpCodes.Sub); } else if (nodoActual.GetType() == typeof(Multiplicacion)) { Multiplicacion n = (Multiplicacion)nodoActual; generar(n.ExprIzq); generar(n.ExprDer); this.il.Emit(Emit.OpCodes.Mul); } else if (nodoActual.GetType() == typeof(Division)) { Division n = (Division)nodoActual; generar(n.ExprIzq); generar(n.ExprDer); this.il.Emit(Emit.OpCodes.Div); } else if (nodoActual.GetType() == typeof(Menor)) { Menor n = (Menor)nodoActual; generar(n.ExprIzq); generar(n.ExprDer); this.il.Emit(Emit.OpCodes.Clt); } else if (nodoActual.GetType() == typeof(Igual)) { Igual n = (Igual)nodoActual; generar(n.ExprIzq); generar(n.ExprDer); this.il.Emit(Emit.OpCodes.Ceq); } else { Console.WriteLine("ERROR-0006 Error tipo de Nodo no identificado"); } }
static void Main(string[] args) { do { try { switch (Menus.MenuPricipal(ref Lista)) { case 1: Menus.MenuCrear(ref Lista); break; case 2: Menus.MenuMostrar(Lista); break; case 3: NodoArbol arbol = Recorridos.CrearArbolPrueba_1(); NodoLista arb = new NodoLista(arbol, $"Arbol de Prueba #{cont + 1}"); Lista.InsertarALaCabeza(arb); cont++; rep = true; break; case 4: NodoArbol arbol1 = Recorridos.CrearArbolPrueba_2(); NodoLista arb1 = new NodoLista(arbol1, $"Arbol de Prueba #{cont + 1}"); Lista.InsertarALaCabeza(arb1); cont++; rep = true; break; case 5: NodoArbol arbol2 = Recorridos.CrearArbolPrueba_3(); NodoLista arb2 = new NodoLista(arbol2, $"Arbol de Prueba #{cont + 1}"); Lista.InsertarALaCabeza(arb2); cont++; rep = true; break; case 6: Console.Clear(); Console.Title = "Información del Programa"; Console.WriteLine("Materia: Estructura de Datos"); Console.WriteLine("Docente: ING. NANCY GABRIELA MARÍN CASTAÑEDA"); Console.WriteLine("Tercer Semestre | Grupo A | Agosto - Diciembre"); Console.WriteLine("Programa hecho por:"); Console.WriteLine("\t Victor Hugo Carreon Pulido - 192310436"); Console.WriteLine("\t Andrea Evelyn Mejia Rubio - 192310177"); Console.WriteLine("\t Edgar Eduardo Arguijo Vazquez - 192310252"); Console.ReadKey(); rep = true; break; case 7: Environment.Exit(0); break; } } catch (System.FormatException) { Console.WriteLine("Ingrese un valor numerico"); } } while (rep); }