2

前缀符号转换成树通常是这样完成的:

从代数表达式创建二叉树

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

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

没有问题。

     +
   /   \
  +     c
 / \
a   b

但是,如果运算符不可拆分,则此方法不起作用。一个例子是成对不同的运算符。

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

左边表示a != b、a != c 和b != c,而右边只表示a != b 和b != c。尝试构建 n 叉树可能会导致无法很好地遍历树:

distinct
 / | \
a  b  c

是否有人对此类问题有经验并且对如何解决该问题有想法?

4

1 回答 1

1

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

于 2015-10-26T17:00:29.077 回答