2015-06-25 68 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 ")" 

要解決該冗餘括號問題,分配各操作者左和右優先級,正如運算符優先級解析,並通過親節點的訪問優先級。只有當訪問節點的優先級低於從父節點傳入的優先級時,訪問纔會輸出括號。