在表达式的二进制树

时间:2012-12-13 12:29:06

标签: binary-tree

我必须为此表达式A*(B-C+D)*P/Q

绘制二叉树

这个是正确的吗?

                        *

             *                    /

          A     +              P     Q

              -   D 

            B   C

4 个答案:

答案 0 :(得分:3)

您的树对应于此表达式:

   (A*(B-C+D))*(P/Q)

虽然技术上正确,但它应该是这样的(如果你假设乘法和除法具有相同的优先权):

   ((A*(B-C+D))*P)/Q

答案 1 :(得分:1)

你的答案是对的。以下是获取此树的步骤

<强> A *(B-C + d)* P / Q

第1步:由于括号具有最高优先级,因此首先进行评估。

  

B-C + d

但是+和 - 具有相同的执行优先级,因此考虑了关联性。运算符从左到右具有相同的关联性,即左侧必须只有一个操作符的操作数。 只有 - 运算符左边有一个操作数,所以首先是操作数,然后是+ 所以表达式改为

  

((B-C)+ D)

     

A * Z * P / Q其中z =((B-C)+ D)

第2步: *和/具有相同的评估优先级,因此要打破*和/的关联关系。运算符从左到右都具有相同的关联性,即左侧必须是明确的,这意味着在运算符的左侧(* OR /)必须只有一个操作数。

所以只有第一个*有一个操作数,即A. 因此,下一步执行A * Z

  

(A * Z)* P / Q

让我们将其重命名为

  

AZ * P / Q

第3步: 现在遵循关联性规则,因为剩余操作数具有相同的优先级 *首先执行,因为它的左侧只有一个操作数 所以,

  

AZP / Q

第4步:最后/运营商将执行

  

AZPQ

答案 2 :(得分:0)

我认为你在写表达时犯了一个错误..据我说它是A * B-(C + D)* P / Q 为此,二叉树将是这样的..

                -
        *                    *
      A   B             +          /
                      C   D      P   Q

答案 3 :(得分:0)

为了明确,表达式树可以在每个二进制操作周围有括号。因此,对于(B-C)+ D和B - (C + D),将导致不同的树,但是由于相关的加法规则,结果将是相同的。

虽然人类读者的清晰度较低,但一致包围的优势在于明确区分(((A *(B-(C + D))) P)/ Q)((A (B-(C + d)))*(P / Q))。