将中缀转换为二叉树

时间:2017-11-02 17:55:05

标签: java binary-tree infix-notation

如何将中缀表达式转换为树?我想手动而不是先编程。例如,让我们看一下这个中缀表达式:

b = (x * a) - y / b * (c + d)

把它变成树是什么规则?或者你建议采取什么步骤来做到这一点?我在这里遇到麻烦,因为有时这些表达式中没有明确的括号:

b = x * a - y / b * c + d

1 个答案:

答案 0 :(得分:2)

您在此处描述的问题通常称为表达式解析,通常在此过程中有两个步骤:

首先,有扫描,您可以将输入字符串分成一堆较小的逻辑单元,每个逻辑单元代表一个单独的"#34 ;输入。例如,给定输入字符串

b = x * a - y / b * c + d

你可能会产生这个令牌序列:

[b] [=] [x] [*] [a] [-] [y] [/] [b] [*] [c] [+] [d]

这样,你从"移动输入是一系列字符" to"输入是一系列单个变量,运算符等。"有很多方法可以执行此步骤,它们通常涉及进行一些手动字符串处理或使用正则表达式(如果您熟悉这些方法)。作为第一步,看看你是否可以使这部分工作。

第二步,可能是您最常关注的一步,是解析,您可以在其中获取该令牌序列并重新构建该语句的含义。这通常涉及确定运算符优先级并实际构建所需的树结构。顺便说一下,那棵树通常被称为表达式树 abstract syntax tree (AST)。

有很多方法可以做到这一点。对于解析表达式,我的个人信息是Dijkstra's shunting-yard algorithm。该算法通过维护两个堆栈并一次处理一个令牌来工作,使用堆栈来确定应该应用哪些运算符。

如果您想看一个如何执行此操作的示例,我为常规教授的离散数学课程构建了truth table generator。您键入逻辑表达式,代码扫描它以获取标记序列,然后使用分流码算法建立AST,然后用于生成真值表工具。 source code已分解,因此每个步骤都是单独完成的,这可能是一个很好的参考。

相关问题