2

私はプログラミングの方法を独学で学ぼうと決心し、「コンピューター科学者のように考える方法」の Python 版に取り組んでいます。演習について質問するのを控えようとしましたが (要点は自分で解決することなので)、これには困惑しました。

第 20 章では、Inorder トラバーサル (式 1+2*3 を使用) と、ツリーをトラバースして各ノードを出力する関数を導入した後、次のように求めています。 "。したがって、出力は (1+(2)*3) のようになると想定しています。

私は一般的に再帰関数に苦労しており、これに苦労しています。左と右の呼び出しの前後に括弧を挿入しようとしましたが、うまくいきませんでした。関数スタックは 5 つの深さになると考えています。

警察からの質問のように感じますが、誰かがこれで私を正しい軌道に乗せることができますか?

ありがとう、

ビリー。

4

3 に答える 3

3

すべての演算子とオペランドのペアを括弧で囲みます」. したがって、出力は(1+(2)*3).

私はこれがアウトプットであってはならないと思います。出力は次のようにする必要があると思います:(1+(2*3))

私にとってこれを表示する最も簡単な方法は、オブジェクト指向のアプローチです。

抽象クラス Node抽象メソッド GetExpressionString()フィールド を持たせますToken

クラスが を継承して実装し、 を返すようにします 。(たとえば、 またはまたは)。OperandNodeGetExpressionString()Token'1''2''3'

クラスは から継承し、フィールド を持ち、実装して を返すようにします。たとえば、との場合、結果はです。OperatorNode LeftRightNodeGetExpressionString()'(' + Left.GetExpressionString() + Token + Right.GetExpressionString() + ')'Left = '2'Right = '3'Token = '*''(2*3)'

それから

expression = new Operator(
               Token='+',
               Left=new Operand(Token='1'),
               Right=new Operator(
                       Token='*',
                       Left=new Operand(Token='2'),
                       Right=new Operand(Token='3')))

expression.GetExpressionString()リターンの呼び出し'(1+(2*3))'

于 2012-05-02T20:27:40.173 に答える
1

C++ のこのコードは、あなたのために働くはずです:

void inorder(node1 *start)
{
    if(!(start->left==NULL && start->right==NULL))
    cout<<"(";
    if(start->left!=NULL)
    inorder(start->left);
    cout<<start->value;
    if(start->right!=NULL)
    inorder(start->right);
    if(!(start->left==NULL && start->right==NULL))
    cout<<")";
}
于 2015-03-07T21:11:09.757 に答える
0
void inorder(TreeNode* p)
{
    if(p)
    {
        if(p->left && p->right)
            cout<<"(";

        inorder(p->left);
        cout<<p->data<<" ";
        inorder(p->right);

        if(p->left && p->right)
            cout<<")";
    }
}
于 2020-07-04T10:59:26.470 に答える