Как определить использование скобок при переводе дерева выражений?

Я работаю над переводом дерева выражений в формат, напоминающий инфиксную нотацию; Я не оцениваю дерево и не выполняю его операции. Дерево содержит как логические, так и реляционные операции, и я хотел бы разумно выводить скобки во время перевода.

Для иллюстрации рассмотрим следующее придуманное выражение:

a < x & (a < y | a == c) & a != d

Если я пройдусь по дереву выражений, сгенерированному этим выражением, по порядку, я выведу следующее выражение, которое неверно.

a < x & a < y | a == c & a != d
// equivalent to (a < x & a < y) | (a == c & a != d)

В качестве альтернативы, я могу снова выполнить обход в порядке, но сгенерировать скобки до и после обработки двоичного выражения. Это приведет к следующему правильному выражению, но с несколькими избыточными скобками.

(((a < x) & ((a < y) | (a == c))) & (a != d))

Существует ли алгоритм обхода дерева выражений, который выдает выражения, заключенные в оптимальные скобки?

Для справки, здесь фрагментExpressionVisitor Я использую, чтобы осмотреть дерево.

class MyVisitor : ExpressionVisitor
{
    protected override Expression VisitBinary(BinaryExpression node)
    {
        Console.Write("(");

        Visit(node.Left);
        Console.WriteLine(node.NodeType.ToString());
        Visit(node.Right);

        Console.Write(")");

        return node;
    }

    // VisitConstant, VisitMember, and VisitParameter omitted for brevity.
}

Ответы на вопрос(2)

Ваш ответ на вопрос