Порядок обхода дерева в скобках

Я решил попытаться научить себя программировать и прорабатываю версию Python "Как думать, как ученый". Пытались не задавать вопросы об упражнениях (поскольку все дело в том, чтобы решить их самостоятельно), но это поставило меня в тупик.

В главе 20 после введения обхода Inorder (работа с выражением 1+2*3) и функции для обхода дерева и печати каждого узла, он затем спрашивает: "изменить printTreeInorder так, чтобы он помещал скобки вокруг каждого оператора и пары операндов ". Таким образом, я предполагаю, что результат должен выглядеть следующим образом (1+(2)*3).

Я борюсь с рекурсивными функциями в целом и борюсь с этим. Я попытался вставить скобки до и после вызовов влево и вправо, но это не сработало, и теперь я думаю, что стек функций будет иметь пять глубин - не понимаю, как из этого получится получить две пары скобок.

Чувствую себя отговорщиком, но кто-нибудь может поставить меня на правильный путь с этим?

Спасибо,

Билли.

2 ответа

puts parentheses round every operator and pair of operands". I'm thus assuming the output should look like (1+(2)*3),

I don't think this should be the output. I think output should be: (1+(2*3))

For me the easiest way to view this is through object oriented approach.

Let abstract class Node have abstract method GetExpressionString() and field Token,

Let class Operand наследовать от Node и реализовать GetExpressionString() so that it returns Token, (например '1' или же '2' или же '3').

Let class Operator наследовать от Node, has fields Left а также Right типа Node и реализовать GetExpressionString() so that it returns '(' + Left.GetExpressionString() + Token + Right.GetExpressionString() + ')', Например, если Left = '2', Right = '3' а также Token = '*', then result is '(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')))

a call of expression.GetExpressionString() возвращается '(1+(2*3))',

Этот код на 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<<")";
}
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<<")";
    }
}
Другие вопросы по тегам