public void genArbol(LinkedList <nodo> nodos) { //ε nodo last = new nodo("#", true, false, false); int idt; idt = Int32.Parse(nodos.Last().getPrimeros()); last.setPrimeros((idt + 1).ToString()); last.setUltimos((idt + 1).ToString()); nodos.AddLast(last); this.raiz = new nodo(".", false, false, false); newNodos.AddFirst(this.raiz); nodo aux = this.raiz; nodo aux2 = nodos.First(); bool esDerecha = false; while ((nodos.FirstOrDefault() != null)) { if (esDerecha == false) { if (aux.getEsTerminal() == false) { aux.setIzquierda(aux2); aux.getIzquierda().setPrevio(aux); aux = aux.getIzquierda(); nodos.RemoveFirst(); if (!(nodos.FirstOrDefault() == null)) { aux2 = nodos.First(); } } else { while (aux.getPrevio().getUnitario() || aux.getPrevio().getDerecha() != null) { aux = aux.getPrevio(); } aux.getPrevio().setDerecha(aux2); aux.getPrevio().getDerecha().setPrevio(aux.getPrevio()); aux = aux.getPrevio().getDerecha(); nodos.RemoveFirst(); if (!(nodos.FirstOrDefault() == null)) { aux2 = nodos.First(); } esDerecha = true; } } else { if (aux.getEsTerminal() == true) { do { aux = aux.getPrevio(); } while ((aux.getDerecha() != null && aux.getUnitario() == false) || (aux.getDerecha() == null && aux.getUnitario() == true)); esDerecha = false; aux.setDerecha(aux2); aux.getDerecha().setPrevio(aux); aux = aux.getDerecha(); nodos.RemoveFirst(); if (!(nodos.FirstOrDefault() == null)) { aux2 = nodos.First(); } } else { aux.setIzquierda(aux2); aux.getIzquierda().setPrevio(aux); aux = aux.getIzquierda(); nodos.RemoveFirst(); if (!(nodos.FirstOrDefault() == null)) { aux2 = nodos.First(); } esDerecha = false; } } } }
private void transform(nodo n) { if (n == null) { return; } //Console.WriteLine(n.getValor() + n.getUnitario() + n.getEsTerminal()); if (n.getEsTerminal() == false && n.getUnitario() == true) // * o + o ? { nodo izquierdaT = n.getIzquierda(); nodo cabezaT = n.getPrevio(); Console.WriteLine(cabezaT.getValor()); Console.WriteLine(izquierdaT.getValor()); if (n.getValor().Equals("?")) { nodo nuevo = new nodo("|", false, false, false); nodo derecha = new nodo("epsilon", true, false, false); nuevo.setIzquierda(izquierdaT); nuevo.setDerecha(derecha); if (cabezaT.getIzquierda() == n) { cabezaT.setIzquierda(nuevo); } else if (cabezaT.getDerecha() == n) { cabezaT.setDerecha(nuevo); } n.setIzquierda(null); } else if (n.getValor().Equals("+")) { nodo nuevo1 = new nodo(".", false, false, false); nodo nuevo2 = new nodo("*", false, true, false); nuevo1.setIzquierda(izquierdaT); nuevo1.setDerecha(nuevo2); nuevo2.setIzquierda(duplicar(n.getIzquierda())); if (cabezaT.getIzquierda() == n) { cabezaT.setIzquierda(nuevo1); } else if (cabezaT.getDerecha() == n) { cabezaT.setDerecha(nuevo1); } n.setIzquierda(null); } } transform(n.getIzquierda()); transform(n.getDerecha()); }