Visualizzazione dei risultati da 1 a 3 su 3

Discussione: eval nodes

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    590

    eval nodes

    salve, ho un alberto binario strutturato nel seguente modo:
    - nodo interno operatore matematico (+, -, *, /)
    - nodo foglia numero intero

    dovrei scrivere un metodo che valuti l'espressione, ossia esegue l'operazione indicata da ogni padre tra i due figli e, quindi, dare il risultato finale

    esempio:
    codice:
           +
        /      \
        -       *
      /  \     /  \
    3     1  2     4
    risultato=10

    quel che ho capito è che devo fare una visita postorder per avere i due valori e poi fare uno switch sul padre per capire quale operazione matematica fare. qualche altro suggerimento?
    Ultima modifica di jimbo0; 07-06-2014 a 16:15

  2. #2
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    Ciao,
    io ragionerei in questo modo:
    -se l'albero passato è vuoto restituisco 0 oppure lancio un eccezione (dipende da ciò che ti è stato chiesto);
    -se il nodo corrente è una foglia restituisco il valore del nodo;
    -altrimenti restituisco il valore del sotto albero sinistro (+,-,*,/) il valore del sotto albero destro;

    un esempio del metodo eval (è solo un abbozzo) che sfrutta un BinaryTree di Stringhe è:
    codice:
        public int eval (){
            return eval(root);
        }
        private int eval (BinaryNode head){
            //se l'albero è vuoto restituisco 0 oppure lancio un eccezione
            if (head == null){
                return 0;
            }
            //se il nodo corrente è una foglia restituisco il valore
            if(head.isLeaf()){
                return Integer.parseInt(head.getData());
            }
            //altrimenti restituisco il valore del sotto albero sinistro (+,-,*,/)
            //il valore del sotto albero destro
            switch (head.getData()){
                case "+" :
                    return eval(head.getLeftChild())+eval(head.getRightChild());
                case "-" :
                    return eval(head.getLeftChild())-eval(head.getRightChild());
                case "*" : 
                    return eval(head.getLeftChild())*eval(head.getRightChild());
                case "/" :
                    return eval(head.getLeftChild())/eval(head.getRightChild());
                default:
                    throw new IllegalArgumentException();
            }
        }

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    590
    grazie mille, avevo già risolto da solo e dimenticato questo thread, magari valuta anche il mio codice se trovi qualcosa che può essere scritto meglio.
    posto il codice così com'è con le mie strutture dati d'appoggio LinkedBinaryTree (albero binario) e BTPosition (che non è altro che un nodo per albero binario)

    codice:
    public static String evalExpr(Position<String>v, LinkedBinaryTree<String> T) {        BTPosition<String> vv = T.checkPosition(v);
            
            if(T.isExternal(v)) return v.element();
            
            else {
                String x,y;
                x= evalExpr(T.left(vv),T);
                y = evalExpr(T.right(vv),T);
                int r=0;
                if(v.element()=="*") r=Integer.parseInt((String) x)*Integer.parseInt((String)y);
                if(v.element()=="-") r=Integer.parseInt((String) x)-Integer.parseInt((String)y);
                if(v.element()=="+") r=Integer.parseInt((String) x)+Integer.parseInt((String)y);
                if(v.element()=="/") r=Integer.parseInt((String) x)/Integer.parseInt((String)y);
                    
                return Integer.toString(r);
            }
        }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.