c++二进制表达式树:如何打印带有适当括号的中缀表达式

C++ Binary Expression Tree: How do I print an infix expression with appropriate parentheses?

本文关键字:表达式 中缀 打印 二进制 何打印 c++      更新时间:2023-10-16

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

我的当前功能:

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表示低优先级(+或-)

当以中缀形式打印表达式树时,您只需要在子表达式(即子表达式)周围打印圆括号,其中操作符的优先级低于主表达式(即父表达式)的操作符。

以下列表达式树(后缀表示法)及其中缀形式为例:

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

注意,在5 + 6附近需要括号,因为子表达式5 6 +的操作符比主表达式5 6 + 7 *的操作符优先级低,但子表达式5 6 + 7 *不需要括号,因为子表达式5 6 + 7 *的操作符优先级高于主表达式4 5 6 + 7 * +

使用这些信息可以很容易地修改问题中的算法,以避免在不需要时使用括号。请注意,由于树中没有父指针,因此让父指针检查是否有任何子指针需要括号比让节点在自己周围加上括号更容易。