式ツリーを使用して後置式を評価することになっています。こんな木があったとします
-
/ \
+ *
/ \ / \
a b c d
最初に a+b サブツリーを評価し、その結果を + ノードに格納し、次に c*d などをルート ノードに格納する必要があります。
スタックを使用して再帰的なアプローチを試みましたが、うまくいきませんでした。擬似コードは次のようになりました
- 関数 eval(ノード)
- eval(ノード->左)
- eval(ノード->右)
- if(node がリーフノード) スタックにプッシュする
- else if(node はオペランドです) pop a と pop b をスタックから node->value = a->value op b->value delete ab;
しかし、これはうまくいきませんでした。また、ノードが削減されていることを示すために、すべてのステップでツリーを表示する必要があります。何度もグーグル検索しましたが、必要な答えを見つけることができませんでした。誰でもこれを行う方法を教えてください。
void expression_tree::evaluate(node *temp)
{
if(!temp)
return;
/// stack_postfix obj;
stack_postfix obj2;
evaluate(temp->left);
evaluate(temp->right);
if(temp->right == NULL && temp->left == NULL)
{
obj2.push(temp);
}
else
{
node * a = obj2.pop();
node *b = obj2.pop();
temp->value = a->value + b->value;
delete a;
delete b;
}
}