顺序树遍历括号

时间:2012-05-02 19:52:34

标签: tree tree-traversal

我决定尝试自学如何编程,并正在通过Python版“如何像计算机科学家一样思考”的方式工作。试图推迟询问有关练习的问题(因为重点是自己解决这些问题),但这个让我难过。

在第20章中,在介绍了Inorder遍历(使用表达式1 + 2 * 3)和遍历树并打印每个节点的函数之后,它会询问:“修改printTreeInorder,使其为每个运算符舍入括号,一对操作数“。我因此假设输出应该看起来像(1+(2)* 3)。

我一般都在使用递归函数,并且正在努力解决这个问题。我尝试在左右调用之前和之后插入括号,这不起作用,现在我认为函数堆栈将是五个深度 - 不要看我如何得到两对括号。

感觉就像一个警察要求,但是有人能把我带到正确的轨道吗?

谢谢,

比利。

3 个答案:

答案 0 :(得分:2)

  

为每个运算符和一对操作数添加括号“。因此,我假设输出应该看起来像(1+(2)*3)

我不认为这应该是输出。我认为输出应该是:(1+(2*3))

对我来说,最简单的方法是通过面向对象的方法

抽象类 Node拥有抽象方法 GetExpressionString() field Token

Operand继承自Node并实施GetExpressionString(),以便它返回Token。 (例如'1''2''3')。

Operator继承自Node字段 LeftRight类型{{1}并实现Node以便它返回GetExpressionString()。例如,如果'(' + 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 :(得分: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<<")";
}

答案 2 :(得分: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<<")";
    }
}