如何在表达式解析树中使用负数?

时间:2014-08-07 20:13:46

标签: parsing math tree computer-science

我正在做一个家庭作业,我应该查看树木来找到表达式,并根据表达式构建我自己的树,但我对如何使用负数感到困惑。赋值的第一个问题是找到此树的表达式: first parse tree

对我而言,这看起来像一棵制作糟糕的树,因为如果你使用有序遍历,你最终得到这个:X*(50/y)-*(z-36)。这个负号是否意味着整个左分支都是负数,就像这样?:-(x*(50/y))*(z-36)

在我看来应该这样做: second parse tree

这里的表达式是(–(50*x)+y)/z,它可以通过顺序遍历正确读取。我是否认为我的教授在这里错了?

编辑:我还有一个关于我教授制作的另一棵树的问题。这是树:

Third parse tree

我不确定最右边的额外+符号是什么意思。看起来答案是(x-(y * 80)) - ((z + 4)+20),但由于有两个加号,我不确定第二个应该做什么。

1 个答案:

答案 0 :(得分:1)

你的教授是对的。表达式由运算符数字组成。与a*b一元一样,运算符可以是二进制(即,它们可以采用两个参数),与-a一样。第一个解析树包含一元运算符-,所以表达式为了清晰起见添加了括号:

(-(x*(50/y)))*(z-36)

将表达式视为一系列操作可能更容易,因此我们可能需要subtract(a,b)来表示表达式a-b。一元运算符(例如-)可能类似negate(a)来表示表达式-a

通过执行有序遍历,表达式可以从树中派生出来,正如您所提到的。基本上,算法是访问左子,root然后右子。如果您通过打印'('只是之前的 ,那么您可以访问每个左边的孩子,然后')'在每个正确的孩子之后,你将获得原始表达的完全括号版本。在伪代码中:

print '('
print left child
print parent 
print right child
print ')'

然而,正如您所发现的那样,这对一元运营商并不起作用。原因是我们用于一元运算符的约定是将它们放在它们应用的表达式的前面,但如果你曾经使用过RPN calculator,它就非常有意义。

在您展示的第三棵树中,有一个一元' +'运算符,因此右下角将呈现为数字+20