0

式ツリーを使用して後置式を評価することになっています。こんな木があったとします

    -
   / \
  +   *
 / \  / \
a  b  c  d

最初に a+b サブツリーを評価し、その結果を + ノードに格納し、次に c*d などをルート ノードに格納する必要があります。

スタックを使用して再帰的なアプローチを試みましたが、うまくいきませんでした。擬似コードは次のようになりました

  1. 関数 eval(ノード)
  2. eval(ノード->左)
  3. eval(ノード->右)
  4. if(node がリーフノード) スタックにプッシュする
  5. 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;
        }

}

4

2 に答える 2