我有一个分配,我有一个公式,让我们说x+(y*z)
,我必须将它转换为二叉树。我已经在网上查看了infix
和postfix
等关键字,他们将帮助将正则表达式转换为可以进一步轻松转换为二叉树的表单。
我唯一的问题是我从未学过这种infix
或postfix
方法,所以有没有其他方法可以转换它,或者这是唯一的方法?我已经尝试了搜索,但这些是我得到的唯一结果。
如果不使用在线资源,我就很难解决。
答案 0 :(得分:1)
Infix和postfix本身不是方法,也不是表示相同公式的方法。 x+(y*z)
已经使用中缀表示法(因为运算符在 in 方面)。另外两个符号是前缀(或波兰表示法),其中运算符在操作数之前(因此x+(y*z)
是+ x * y z
)和后缀(或反向波兰表示法),其中运算符在操作数之后(所以x+(y*z)
是y x * x +
)。后缀表示法很有用,因为它可以通过堆栈轻松实现(所以要计算y x * x +
将y
和x
放在堆栈上,然后我们会看到*
弹出{来自堆栈的{1}}和x
并将y
放回堆栈,然后我们将x*y
放入堆栈,然后我们看到x
弹出+
来自堆栈的{} {}和z*y
并将x
放回堆栈并繁荣,这是你的计算)
您可以通过Shunting-yard algorithm从中缀表示法转换为后缀(维基百科解释得比我更好)
因此,您可以通过二进制树轻松地表示后缀表示法中的等式,因为您通过等式,将操作数作为叶子添加到堆栈中,当您到达运算符时,从堆栈中弹出前两个节点并创建一个新的节点,以操作符作为父节点,操作数作为子节点弹出。然后将此树推回堆栈。重复,直到达到等式的结尾。
答案 1 :(得分:0)
有许多解析库可用于此类工作。
例如,使用pyparsing:
from pyparsing import *
def rearrange(tks):
T=tks[0]
T[0],T[1] = T[1],T[0]
return tks
expr = Forward()
arithOp = Word( "+-*/", max=1 )
terminal = ( Word(alphas, alphanums)
| Word(nums)
| Suppress("(") + expr + Suppress(")") )
expr << Group(terminal + arithOp + terminal).setParseAction(rearrange)
parseTree = expr.parseString("x+(y*z)")
print parseTree
将打印:
[['+', 'x', ['*', 'y', 'z']]]