C ++二进制表达式树:如何使用适当的括号打印中缀表达式?

时间:2016-11-17 06:31:40

标签: c++ tree binary-tree expression-trees

现在我有这个简单的打印算法,打印出完美的括号。问题是,括号并不总是必要的,我需要弄清楚如何在不需要时打印它们。

我目前的职能:

void printIn(Node* t){

if(t!= NULL) {
    if(isleafNode(t))
        cout << t->element;
    else {      
        cout << "(";
        printIn(t->left);
        cout << t->data;
        printIn(t->right);
        cout << ")";
        }
  }

这里的问题是一些后缀表达式,如 2 50 + 8 + 可以用中缀打印为2 + 50 + 8个((2 + 50)+ 8))(

这是一个后缀图表,用于中缀它的外观。我只是在整个外部添加括号,并且无论如何都添加所有添加。

4 50 6 + +           4 + ( 50 + 6 )
4 50 + 6 +           4 + 50 + 6
4 50 + 6 2 * +       4 + 50 + 6 * 2
4 50 6 + + 2 *       ( 4 + ( 50 + 6 ) ) * 2
a b + c d e + * *    ( a + b ) * ( c * ( d + e ) )

以下是我的样子图表:

4 50 6 + +           ( 4 + ( 50 + 6 ))
4 50 + 6 +           ( ( 4 + 50 ) + 6)
4 50 + 6 2 * +       ( ( 4 + 50 ) + ( 6 * 2 ) )
4 50 6 + + 2 *       ( ( 4 + ( 50 + 6 ) ) * 2 )
a b + c d e + * *    ( ( a + b) * ( c * ( d + e ) ) )

如何修复算法以消除额外的括号? p 请记住,我确实有一个getPrecedence(string)函数,它返回1表示高优先级(*或/),0表示低优先级(+或 - )

1 个答案:

答案 0 :(得分:1)

以中缀形式打印表达式树时,只需在子表达式(即子项)周围打印括号,其中运算符的优先级低于主(即父项)表达式的运算符。

作为示例,请使用以下表达式树(以后缀表示法)及其中缀形式。

4 5 6 + 7 * +        4 + (5 + 6) * 7

请注意,由于子表达式5 6 +的运算符的优先级低于主表达式5 6 + 7 *的运算符,因此需要大约5 + 6的括号,但子表达式5不需要它。 6 + 7 *因为运算符的优先级高于主表达式4 5 6 + 7 * +

的运算符

使用此信息可以很容易地修改问题中的算法,以避免在不需要时使用括号。请注意,由于树中没有父指针,因此如果任何子节点需要括号而不是使节点在其周围放置括号,则更容易进行父节点检查。