Necesito una estructura de árbol que admita "y" y "o" ing. Por ejemplo, dada una expresión regular como ab|c(d|e)
quiero convertir eso en un árbol.¿Cómo construir un árbol y?
Entonces, al principio tenemos dos "o" ramas ... puede ir hacia abajo ab
, o c(d|e)
. Si va por la rama ab
, obtiene dos nodos, a
yb
(o a
seguido de b
, lo que sea). Entonces, si hay que bajar la rama c(d|e)
, se obtiene c
y (d|e)
, entonces (d|e)
se divide en d
oe
.
La fabricación de una estructura de árbol es fácil, sólo tiene algo así como
class Node {
string element;
Node[] children;
}
Pero entonces, ¿cómo saber si los niños deben estar "unidos mediante AND" o "ORED"? Creo que cada nivel del árbol debe alternar entre "AND" y "junta tórica"
¿Eso tiene sentido? ¿Alguien puede sugerir una estructura para esto?
Algunas personas han sugerido que almacena el "operador" en el nodo, lo cual está bien, pero no hay una manera de aprovechar el hecho de que cada nivel se alterna siempre o, AND, OR, y , ...?
Edit: No estoy seguro de por qué la gente sigue asumiendo que este es un árbol binario. No es. Esperaba que el pequeño fragmento de código te avisara. El ejemplo solo ocurre para tener solo 2 ramas.
Actualmente inclinando hacia esto:
abstract class Node { }
class DataNode : Node
{
string data;
}
abstract class OpNode : Node
{
Node[] children;
}
class OrNode : OpNode { }
class AndNode : OpNode { }
Creo que la alternancia de niveles AND/OR es solo una coincidencia para este ejemplo. En general, debería poder mezclar AND y OR en el mismo nivel. Ver mi respuesta – mbeckish
@mbeckish: ¿Lo es? ¿Puedes dar un ejemplo donde * no * alternas? – mpen
Además, no necesita una matriz de elementos secundarios (a menos que vaya a admitir operadores N-ary). – mbeckish