2015-06-25 6 views
0

У меня есть дерево выражений, которое мне нужно пройти и сгенерировать определенную строку. Допустим, у меня есть это деревоТраверс/преобразование дерева выражений

 OR 
    /\ 
    AND C 
/ \ 
A  B 

И я хочу, чтобы преобразовать его в:

(A AND B) OR C 

я думал использовать в порядке обхода, но это не совсем то, что я буду нуждаться.

+0

Вы хотите реализовать в java или C# или просто алгоритме? пользовательские теги – Panther

+0

Что, по-вашему, не так с обходным путем? – rici

+0

@ Язык Panther на самом деле не имеет значения, даже псевдокод был бы точным – Tamerlane

ответ

0
abstract class Expression { 
} 

class Binary extends Expression { 

    final String operator; 
    final Expression left, right; 

    Binary(String operator, Expression left, Expression right) { 
     this.operator = operator; 
     this.left = left; 
     this.right = right; 
    } 

    @Override 
    public String toString() { 
     return String.format("(%s %s %s)", left, operator, right); 
    } 
} 

class Variable extends Expression { 

    final String name; 

    Variable(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return name; 
    } 
} 

@Test 
public void testExpression() { 
    Expression e = new Binary("OR", new Binary("AND", new Variable("A"), new Variable("B")), new Variable("C")); 
    System.out.println(e); 
    // -> ((A AND B) OR C) 
} 
+1

Я не уверен, могу ли я увидеть какой-либо обход здесь – Tamerlane

+0

Обход в неявном рекурсивном вызове 'Binary.toString'. Внутри этого метода аргументы 'String.format' преобразуются в строки. – rici

2

Самое простое решение печатает избыточные круглые скобки:

Visit(node): 
    Output "(" 
    If node.has_left(): 
    Visit(node.left) 
    Output node.label 
    If node.has_right(): 
    Visit(node.right) 
    Output ")" 

Чтобы исправить избыточную проблему скобку, присваивают каждому оператору лево- и приоритет, так же, как и в операторной старшинства разборе, и передают родителям приоритет узла в посещении. Затем посещение выводит круглые скобки только в том случае, если приоритет посещенного узла ниже, чем переданный по приоритету от родительского узла.

Смежные вопросы