从数学表达式创建二叉树

时间:2012-09-12 04:26:02

标签: c#

我有一个像((2+8)*8)-(5*(5+2)) Or + 2 + 1 1这样的表达式。我想在其中制作二叉树。

  +
 / \
2   +
   / \
  1   1

如何制作这个二叉树?

2 个答案:

答案 0 :(得分:7)

我有一个类似的项目,这就是我做到的:

  1. 对字符串进行标记。看看每个符号是什么。例如,列表可能包含:

    '(' Open parantheses
    '11' Number
    '+' Operator etc
  2. 将表达式转换为postfix(或前缀,如果需要)表示法。一种可以做到这一点的算法称为Shunting Yard algorithm。后缀表示法的优点是,您可以使用基于堆栈的方法(或二进制树,如果需要)更轻松地评估表达式。

  3. 评估后缀表达式。您可以通过两种方式执行此操作,即二叉树和堆栈。

  4. 堆栈评估:

    以后缀表示法转换的示例表达式如下所示:

    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个弹出项目的父节点。然后将节点推回堆栈。

    这种方法的缺点是你还有一个步骤:创建树。

    最后的笔记

    这是我将使用的方法。也许有比这更有效的方法,但这就是我要做的。

答案 1 :(得分:2)

这是来自中缀字符串的C++ code for creating a binary expression tree