前缀表示法转换为树通常如下所示:
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
是否有人遇到过这类问题,并对如何解决问题有所了解?
答案 0 :(得分:1)
c#System.Linq.Expressions命名空间通过拥有大量节点类型和基类访问者来解决它,您可以在其中覆盖每个节点类型的访问方法,默认情况下只遍历整个树。例如,有一个用于调用方法的节点类型,其中方法定义,对象和所有参数都是MethodCallExpression节点的子节点,返回值是节点所代表的值。你可以看到它不是二叉树,甚至不是常规树。