【问题标题】:C++ Binary Expression Tree: How do I print an infix expression with appropriate parentheses?C++ 二进制表达式树:如何打印带有适当括号的中缀表达式?
【发布时间】:2016-11-17 06:31:39
【问题描述】:

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

我目前的功能:

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 instad of ((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

【问题讨论】:

  • 是否为表达式提供附加信息以使括号不是一个选项?
  • @SenselessCoder 'Additional information"' 例如什么?所需的一切都已在后缀表达式和表达式树中提供。

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


【解决方案1】:

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

以下面的表达式树(后缀表示法)及其中缀形式为例。

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

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

使用此信息可以轻松修改问题中的算法,以避免在不需要括号时出现括号。请注意,由于树中没有父指针,因此让父节点检查是否有任何子节点需要括号比让节点在自身周围放置括号更容易。

【讨论】:

  • 这确实有帮助,但我仍然不清楚该算法到底该怎么做。为了检查父运算符并放置括号,我是否必须在每次递归时遍历整个字符串?
  • 我在回复中添加了附加提示,希望对您有所帮助。
猜你喜欢
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多