Мне нужна древовидная структура, которая поддерживает «и» и «или» ing. Например, учитывая регулярное выражение типа 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;
}
Но тогда как вы узнаете, должны ли дети быть "заколоченными" или "зародышами"? Я думаю, что каждый уровень дерева должен чередоваться между "anding" и "oring"
Это имеет смысл? Кто-нибудь может предложить структуру для этого?
Несколько человек предложили хранить «оператор» на узле, что нормально, но нет ли способа воспользоваться тем, что каждый уровень всегда чередуется или, и, или, или,…
Редактировать: Не совсем уверен, почему люди продолжают считать, что это двоичное дерево. Это не . Я надеялся, что крошечный фрагмент кода сработает. В примере просто бывает только 2 ветви.
В настоящее время склоняется к этому:
abstract class Node { }
class DataNode : Node
{
string data;
}
abstract class OpNode : Node
{
Node[] children;
}
class OrNode : OpNode { }
class AndNode : OpNode { }