如何用C#中的逻辑运算符计算表达式树

时间:2017-01-24 15:28:07

标签: c# data-structures tree-traversal

我有一个树结构,叶子节点包含表达式,它们被声明为True或False,由逻辑(AND / OR)条件连接。我正在寻找一种算法/解决方案,通过基于逻辑运算符的深度优先搜索来评估树 Image of sample tree structure 如果父节点是AND,则如果当前节点被评估为false,则不需要进一步遍历兄弟节点。 (如果当前节点为TRUE,那么如果父节点是OR,则不会再访问兄弟) - 这将优化评估。我只是想知道是否已经存在解决方案/代码,而不是重新发明它

sep=';'

注意:我可以轻松地在C#中执行递归BFS,但发现这个更难 Image of sample tree structure

1 个答案:

答案 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;