我有一个树结构,叶子节点包含表达式,它们被声明为True或False,由逻辑(AND / OR)条件连接。我正在寻找一种算法/解决方案,通过基于逻辑运算符的深度优先搜索来评估树 如果父节点是AND,则如果当前节点被评估为false,则不需要进一步遍历兄弟节点。 (如果当前节点为TRUE,那么如果父节点是OR,则不会再访问兄弟) - 这将优化评估。我只是想知道是否已经存在解决方案/代码,而不是重新发明它
sep=';'
注意:我可以轻松地在C#中执行递归BFS,但发现这个更难 Image of sample tree structure
答案 0 :(得分:1)
对树进行递归遍历。您收集评估每个子节点的结果,然后应用您的逻辑操作并返回结果。基本逻辑如下所示。
代码是类似C#的伪代码。从您发布的代码中我不清楚如何区分运算符节点(AND和OR)与值为True和False的节点。但您应该能够使用这个基本算法进行一些更改以适合您的代码。
bool EvaluateNode(TreeNode node)
{
// if it's a child node, return its value
if (node has no children)
{
return node._value;
}
switch node.Operator
{
case operator.AND:
// for AND, we can shortcut the evaluation if any child
// returns false.
for each child
{
if (EvaluateNode(child) == false)
return false;
}
// all children returned true, so it's true
return true;
case operator.OR:
// for OR, we can shortcut the evaluation if any child
// returns true.
for each child
{
if (EvaluateNode(child) == true)
return true;
}
// none were true, so must be false
return false;
default:
// Unknown operator. Some error.
break;
}
}
如果您不想进行快捷方式评估,这仍然有效。你只需稍微改变你的循环。例如,AND案例将是:
bool result = true;
for each child
{
result = result & EvaluateNode(child);
}
return result;
OR案例将是:
bool result = false;
for each child
{
result = result | EvaluateNode(child);
}
return result;