【发布时间】:2011-05-21 20:45:21
【问题描述】:
我需要一个支持“与”和“或”的树结构。例如,给定一个像ab|c(d|e) 这样的正则表达式,我想把它变成一棵树。
所以,起初我们有两个“或”分支......它可以向下 ab 或 c(d|e)。如果你沿着ab 分支前进,你会得到两个节点,a 和 b(或a,然后是b,等等)。然后如果你沿着c(d|e) 分支下去,你会得到c 和 (d|e),然后(d|e) 被分成d 或 e。
制作树形结构很容易,你只要有类似的东西
class Node {
string element;
Node[] children;
}
但是你怎么知道孩子应该是“anded”还是“ored”呢?我猜树的每一层都应该在“anding”和“oring”之间交替
这有意义吗?任何人都可以为此建议一个结构吗?
有些人建议将“运算符”存储在节点上,这很好,但是没有办法利用每个级别总是交替的事实或,和,或,和,... ?
编辑:不太清楚为什么人们一直认为这是一棵二叉树。 不是。我希望小代码 sn-p 能给你提示。这个例子只是碰巧只有2个分支。
目前倾向于这个:
abstract class Node { }
class DataNode : Node
{
string data;
}
abstract class OpNode : Node
{
Node[] children;
}
class OrNode : OpNode { }
class AndNode : OpNode { }
【问题讨论】:
-
我认为交替的 AND / OR 级别只是这个例子的巧合。通常,您应该能够在同一级别上混合使用 AND 和 OR。看我的回答。
-
@mbeckish:是吗?你能提供一个你不会替代的例子吗?
-
另外,您不需要子数组(除非您要支持 N 元运算符)。
-
@Ralph: a|b|c 是一个简单的例子。
-
你是如何用树的每一层和或或仅制作 (a|b|c)(de) 的?
标签: c# data-structures