我有一个简单的问题。
为什么所有表达式树都被建模为“二叉树”而不是“N树”?
是否有任何理由不能使用N-ary树建模表达式?
答案 0 :(得分:2)
表达树通常是二元的,有一些很好的理由:
+
,-
,*
,/
)或逻辑谓词(AND
,{{1} },OR
,NOT
)。存在所有二进制(和一元)操作,因此二叉树最有意义。你可以拥有例如n-ary XOR
,但这只是没有充分理由使事情变得复杂。从更理论的角度来看,如果你有一个n-ary树,你可以使用等效的二叉树来表示它而不会丢失任何东西。使用n-ary +
示例,以下树(一个n元和一个二元)可以被认为是相同的:
+
另一方面,有些库使用n-ary表达树,它们是有意义的。例如,C#表达式树(来自 + +
/|\ / \
a b c + c
/ \
a b
名称空间)使用n-ary树作为调用表达式。因此,表达式System.Linq.Expressions
将表示为f(a, b, c)
,如下所示:
InvocationExpression
答案 1 :(得分:0)
为什么所有表达式树都被建模为“二叉树”而不是“N树”?
他们不是。表达式树的内部节点是运算符,运算符至少可以是一元的,二元的或三元的,也许更多。
是否有任何理由不能使用N-ary树建模表达式?
他们是。