构建二进制表达式树C ++

时间:2013-12-04 19:43:18

标签: c++ binary-tree

我制作了一个从简单表达式构建二叉树的算法。但我需要每个动作的括号。例如,我可以转换此表达式:(2+(3*5))。在数学中,如果没有任何括号,一切都可以,但我的算法可以在没有它们的情况下工作。有没有办法制作一个算法,可以使二进制表达式树与该表达式一起使用:2+3*5? 这是我的算法,每个动作都需要括号:

void Tree::MakeTree(string expr, int &pos, Node *node)
{
    if(expr[pos] == '(')
    {
        pos++;
        node->Left = new Node;
        node->Left->Left = NULL;
        node->Left->Right = NULL;
        MakeTree(expr, pos, node->Left);
        MakeTree(expr, pos, node);
        return;
    }

    if(expr[pos] >= '0' && expr[pos] <= '9')
    {
        node->data = expr[pos];
        pos++;
        return;
    }

    if(expr[pos] == '+' || expr[pos] == '-' || expr[pos] == '*' || expr[pos] == '/')
    {
        node->data = expr[pos];
        pos++;
        node->Right = new Node;
        node->Right->Left = NULL;
        node->Right->Right = NULL;
        MakeTree(expr, pos, node->Right);
    }

    if(expr[pos] == ')') 
        {
            pos++;
            return;
        }
}

如果你能提供优化我的算法的解决方案会很棒,因为我觉得它不是很好。

1 个答案:

答案 0 :(得分:1)

您尝试解决问题的方式过于简单。那不行。为什么?因为你对特定符号的反应不仅取决于符号本身,而且取决于你在哪个上下文符号中。因此,您必须实现状态机,并且在不同的状态下,即使对相同的输入也会有不同的反应。例如,当你得到符号' - '时它是什么,表达的一部分如'5-3'或一元减去'-6'?这取决于您收到该符号时的状态。因此,处理语法解析的完整逻辑的实现并不那么简单,而且更糟糕的是相当单调。这就是为什么在真正的程序中人们通常不会手动执行,而是使用lex / flex等特殊工具或提升库精神等。这并不意味着你无法实现学习,但回答这个问题可能对于stackoverflow格式来说太大了,它已经在很多书中得到了解答。因此,找一本好的语法解析书,或尝试在互联网上找到如何实现简单计算器的教程。