Prefix / Polish表示树中的可链接/ N-ary操作支持

时间:2015-10-23 10:09:25

标签: constraints expression-trees polish-notation

前缀表示法转换为树通常如下所示:

Create a binary tree from an algebraic expression

但是,我需要支持具有两个以上操作数的所谓可链接操作。如果该操作是可拆分的,即

(+ a b c) = (+(+ a b) c)

没有问题。

     +
   /   \
  +     c
 / \
a   b

但是,如果操作员不能拆分,则不起作用。一个例子是成对不同的运算符。

(distinct a b c) != (distinct (distinct a b) c)

左侧表示!= b,a!= c和b!= c,而右侧表示只有!= b和b!= c。尝试构建一个n-ary树可能会导致无法很好地遍历树:

distinct
 / | \
a  b  c

是否有人遇到过这类问题,并对如何解决问题有所了解?

1 个答案:

答案 0 :(得分:1)

c#System.Linq.Expressions命名空间通过拥有大量节点类型和基类访问者来解决它,您可以在其中覆盖每个节点类型的访问方法,默认情况下只遍历整个树。例如,有一个用于调用方法的节点类型,其中方法定义,对象和所有参数都是MethodCallExpression节点的子节点,返回值是节点所代表的值。你可以看到它不是二叉树,甚至不是常规树。