Java 作为二叉树的表达式树

Java 作为二叉树的表达式树,java,expression,expression-trees,Java,Expression,Expression Trees,我有一个简单的问题 为什么所有表达式树都建模为“二叉树”而不是“N元树” 表达式不能使用N元树建模有什么原因吗?表达式树通常是二进制的原因有很多: 最常见的表达式树表示算术运算(+,-,*,/)或逻辑谓词(和,或,非,异或)。有所有的二元(和一元)操作,所以二元树是最有意义的。例如,您可以使用n元+,但这只会使事情变得复杂,没有充分的理由 从更理论的角度来看,如果你有一个n元树,你可以用一个等价的二叉树来表示它,而不会丢失任何东西。使用n元+示例,可以认为以下树(一个n元树和一个二进制树)是相同

我有一个简单的问题

为什么所有表达式树都建模为“二叉树”而不是“N元树”


表达式不能使用N元树建模有什么原因吗?

表达式树通常是二进制的原因有很多:

  • 最常见的表达式树表示算术运算(
    +
    -
    *
    /
    )或逻辑谓词(
    异或
    )。有所有的二元(和一元)操作,所以二元树是最有意义的。例如,您可以使用n元
    +
    ,但这只会使事情变得复杂,没有充分的理由
  • 从更理论的角度来看,如果你有一个n元树,你可以用一个等价的二叉树来表示它,而不会丢失任何东西。使用n元
    +
    示例,可以认为以下树(一个n元树和一个二进制树)是相同的:

      +       +
     /|\     / \
    a b c   +   c
           / \
          a   b
    
  • 另一方面,有些库在有意义的地方使用n元表达式树。例如,C#expression树(来自
    System.Linq.Expressions
    命名空间)使用n元树作为调用表达式。因此,表达式
    f(a,b,c)
    将表示为
    InvocationExpression
    ,如下所示:

      f
     /|\
    a b c
    
    为什么所有表达式树都建模为“二叉树”而不是“N元树”

    他们不是。表达式树内部节点是操作符,操作符可以是一元、二元或三元,至少可以是更多

    有什么原因不能使用N元树对表达式建模吗


    是的。

    他们肯定能。。。但所有n元树都可以建模为二叉树,那个么为什么还要为额外的复杂性而烦恼呢?那个么这是否意味着表达式树也可以使用n元树呢?因为无论我在哪里读到表达式树,我都只看到二叉树的例子。它们可能是,但在大多数情况下并不必要,这取决于你处理的表达式树的类型。如果你不必使用n元树,那为什么要麻烦呢?@LouisWasserman,很抱歉我没有完全理解。我们谈论的是什么类型的表达式,为什么你需要n元树的全部通用性?你能说说你谈论的原因吗?