En una publicación anterior, hablaba sobre que es la notación posfija, para que puede ser útil y mostraba un pequeño ejemplo con una expresión aritmética simple:
(9 - (5 + 2)) * 3
Pues bien, hoy voy a mostraros como podemos crear el árbol binario correspondiente para analizar o evaluar esta expresión, haciendo uso del recorrido en postorden.
Lo primero que debemos hacer es crear el árbol, respetando las siguientes reglas:
⦁ Los nodos con hijos (padres) representarán los operadores de la expresión.
⦁ Las hojas (terminales sin hijos) representarán los operandos.
⦁ Los paréntesis generan sub-árboles.
Si queremos obtener la notación postfija a partir de este árbol de expresión, debemos recorrerlo en postorden (nodo izquierdo – nodo derecho – nodo central), obteniendo la expresión: 952+-3x
Así, si quisiéramos evaluar la expresión, podemos hacer uso de un algoritmo recursivo. A continuación tenemos el pseudocódigo que realiza esta tarea:
Recorrer en PostOrden(NODO)
Si NODO es válido entonces
Recorrer en PostOrden(NODO.Izquierdo)
Recorrer en PostOrden(NODO.Derecho)
Evaluar(NODO)
...
void MathHelpers::PostOrden(Arbol* pNodo)
{
if (pNodo)
{
PostOrden(pNodo->Izq);
PostOrden(pNodo->Der);
pNodo->Eval;
}
}
void Arbol::Eval()
{
switch(pNodo->Operador)
{
case ‘-‘:
this->Valor = this->Izq - this->Der;
break;
case ‘+’:
this->Valor = this->Izq + this->Der;
break;
case ‘x’:
this->Valor = this->Izq * this-Der;
break;
case ‘/’:
this->Valor = this->Izq / this->Der;
break;
}
}
La verdadera expresión sería (9-(5+2))*3
ResponderEliminarSi Ramón, si has leído el artículo verás que esa es exactamente la expresión indicada y en postorden sería: 952+-3x
ResponderEliminarLo que pasa que la expresion en el dibujo de fondo azul, donde esta el arbol, la expresion esta mal, ya que dice (9-(5+2)*3), checalo por que te confunde. saludos
EliminarHola Hector y muchas gracias! Infografía corregida. Un saludo.
Eliminar¿Hay algún algoritmo que dada una expresión algebraica me cree la notación polaca prefija?
ResponderEliminar