从数学表达式创建二叉树
我有一个表达式((2+8)*8)-(5*(5+2)) Or + 2 + 1 1
。 我想在其中制作二叉树。
+ / \ 2 + / \ 1 1
我怎样才能制作这个二叉树?
我有一个类似的项目,这就是我做的方式:
-
对字符串进行标记。 看看每个符号是什么。 例如,列表可能包含:
'('开放的parantheses '11'号码 '+'运营商等
-
将表达式转换为postfix (或前缀,如果需要)表示法。 可以做到这一点的一种算法叫做Shunting Yard算法 。 后缀表示法的优点是,您可以使用基于堆栈的方法(或二进制树,如果需要)更轻松地评估表达式。
-
评估后缀表达式。 您可以通过两种方式执行此操作,即二叉树和堆栈。
堆栈评估:
您使用后缀表示法转换的示例表达式如下所示:
2 8 + 8 * 5 5 2 + * -
评估工作方式如下:遇到数字时,将其推入堆栈。 遇到操作员时,从堆栈中弹出2个项目,进行计算,然后将结果推送到堆栈中。 最后,你应该留下最终的结果。
对于上面的例子,我们将这样做:
Push 2 [Stack content: 2] Push 8 [2 8] Pop 2 and 8 [] Push 2+8 [10] Push 8 [10 8] Pop 10 and 8 [] Push 10*8 [80] Push 5 [80 5] Push 5 [80 5 5] Push 2 [80 5 5 2] Pop 2 and 5 [80 5] Push 2 + 5 [80 5 7] Pop 7 and 5 [80] Push 7 * 5 [80 35] Pop 80 and 35 [] Push 80 - 35 [45] Final result is 45.
二叉树
我就是这样做的:就像基于堆栈的方法一样,使用一堆节点。 遇到运算符时,从堆栈中弹出2个项目,但不是进行求值,而是使用运算符创建节点,并使其成为2个弹出项目的父节点。 然后将节点推回堆栈。
这种方法的缺点是你还有一个额外的步骤:创建树。
最后的笔记
这是我将使用的方法。 也许有比这更有效的方法,但这就是我要做的。
这是用于从中缀字符串创建二进制表达式树的C ++代码 。