我必须为这个表达式绘制二叉树A*(B-C+D)*P/Q
这是正确的吗?
*
* /
A + P Q
- D
B C
你的树对应于这个表达式:
(A*(B-C+D))*(P/Q)
虽然在技术上是正确的,但它应该是这样的(如果你假设乘法和除法具有相同的优先级):
((A*(B-C+D))*P)/Q
你的答案是正确的。以下是获取这棵树的步骤
A*(B-C+D)*P/Q
第 1 步:由于括号具有最高优先级,因此首先对其进行评估。
B-C+D
但是 + 和 - 具有相同的执行优先级,因此考虑了关联性。运算符从左到右具有相同的关联性,即左侧必须只有一个运算符的操作数。只有 - 运算符的左侧有一个操作数,所以它先被执行,然后 + 所以表达式变为
((BC)+ D)
A*Z*P/Q 其中 z=( (BC) + D )
步骤2: *和/具有相同的评估优先级,因此考虑打破*和/的平局关联性。两个运算符从左到右具有相同的关联性,即左侧必须是明确的,这意味着运算符(* OR /)的左侧必须只有一个操作数。
所以只有第一个 * 有一个操作数,即 A 因此接下来执行 A*Z
(A*Z)*P/Q
让我们将其重命名为
AZ*P/Q
第 3 步: 现在遵循关联性规则,因为剩余操作数具有相同的优先级 * 首先执行,因为它的左侧 AZ 只有一个操作数,所以,
AZP/Q
第 4 步: finally / 运算符将被执行
AZPQ
为了明确起见,表达式树可以在每个二元运算周围有括号。所以这将导致 (B- C) +D 和 B - (C + D) 的不同树,尽管由于加法的关联规则,结果将是相同的。
虽然对于人类读者来说不太清晰,但一致的包围的优点是可以清楚地区分 (((A*(B-(C+D))) P)/Q) 和 ((A (B-(C+D)) )*(P/Q))。
我认为您在编写表达式时犯了一个错误..根据我的说法,这将是 A*B-(C+D)*P/Q 而对于这个二叉树将是这样的..
-
* *
A B + /
C D P Q