Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Guz en 16 de Abril 2021, 02:56

Título: Ayuda con arboles binarios - JAVA
Publicado por: Guz en 16 de Abril 2021, 02:56
Hola a todos buen día, estoy haciendo unos trabajos con arboles binarios en java, ahora mismo lo que estoy haciendo es que el usuario mande una expresion por ejemplo "(((a*c) + (e / g)) – (b + d))"
De ahí lo que tiene que hacer la funcion es seguir seguir unos pasos para ir guardando los valores.

Los pasos son estos:

1.- La primera vez que se encuentre un paréntesis a la izquierda, crear un nodo que será
el nodo raíz. Se llama a éste NODO ACTUAL y se mete en la pila.

2.- Cada vez que se encuentre un nuevo paréntesis a la izquierda, crear un nuevo nodo.
Si el NODO ACTUAL no tiene un hijo izquierdo, hacer el nuevo nodo el hijo izquierdo;
en caso contrario hacerlo hijo derecho. Hacer el nuevo nodo el NODO ACTUAL y
meterlo en la pila.

3.- Cuando se encuentra un operando, crear un nuevo nodo y asignar el operando a su
componente de datos. Si el NODO ACTUAL no tiene un hijo izquierdo, hacer el nuevo
nodo el hijo izquierdo; en caso contrario, hacerlo el hijo derecho.

4.- Cuando se encuentre un operador, sacar un nodo de la pila (ahora será el NODO
ACTUAL) y situarlo en el campo de datos del nodo.

5.- Ignorar paréntesis derecho y espacios

Hasta ahora todo bien, lo que pasa es que la pila se me desborda, no puedo hacer que se detenga en cierto punto D:

el codigo es el siguiente

Código: [Seleccionar]
public void expresionAritmeticaPriorizada(String expresion){
        int tamanio = expresion.replaceAll("\\s","").length();
        PilaLista pila = new PilaLista();
        NodoDoble nodotemp = null;
        raiz = null;
        SalidaEstandar.consola("El tamanio es " + tamanio);
        expresionAritmeticaPriorizada(expresion.replaceAll("\\s",""), 0,tamanio, raiz, pila, nodotemp);
        SalidaEstandar.consola("Imprimire");
    }

 private void expresionAritmeticaPriorizada(String expresion, int caracter,int tamanio,
                                               NodoDoble nodoActual, PilaLista pila, NodoDoble nodotemp){
        SalidaEstandar.consola("Ahora voy con " + expresion.charAt(caracter));
        if (tamanio < caracter){
            SalidaEstandar.consola();
        }else {
            if (expresion.charAt(caracter) == '(') {
                SalidaEstandar.consola("Es un parentesis");
                if (nodoActual == null){
                    SalidaEstandar.consola("Es el primero, lo metere en la raiz");
                    nodoActual = new NodoDoble(null);
                    pila.poner(nodoActual);
                    expresionAritmeticaPriorizada(expresion, caracter+1,tamanio,nodoActual, pila, nodotemp);
                }else {
                    SalidaEstandar.consola("No es primero, solo a la pila ");
                    nodotemp = new NodoDoble(null);
                    if (nodoActual.getLigaIzq() == null) {
                        nodoActual.setLigaIzq(nodotemp);
                    }else {
                        nodoActual.setLigaDer(nodotemp);
                    }
                    pila.poner(nodotemp);
                    expresionAritmeticaPriorizada(expresion, caracter+1,tamanio, nodotemp, pila, nodotemp);
                }
            }else if(esNumero(expresion.charAt(caracter)) || ExpresionAritmetica.esOperando(expresion.charAt(caracter))){
                SalidaEstandar.consola("Es un operando, se va a un nodo");
                nodotemp = new NodoDoble(expresion.charAt(caracter));
                if (nodoActual.getLigaIzq() == null) {
                    nodoActual.setLigaIzq(nodotemp);
                }else {
                    nodoActual.setLigaDer(nodotemp);
                }
                expresionAritmeticaPriorizada(expresion, caracter+1,tamanio, nodoActual, pila, nodotemp);
            }else if (expresion.charAt(caracter) == ')' || expresion.charAt(caracter) == ' '){
                SalidaEstandar.consola("Se ingnora ya que es un ) o espacio");
                expresionAritmeticaPriorizada(expresion, caracter+1,tamanio, nodoActual, pila, nodotemp);
            }else if (!ExpresionAritmetica.esOperando(expresion.charAt(caracter)) && !esNumero(expresion.charAt(caracter))){
                SalidaEstandar.consola("Es un operado.");
                nodoActual = (NodoDoble) pila.quitar();
                nodoActual.setInfo(expresion.charAt(caracter));
                expresionAritmeticaPriorizada(expresion,caracter+1,tamanio, nodoActual, pila, nodotemp);
            }
        }

    }



¿Alguien me podria ayudar por favor?