我有一個表達式樹,我需要遍歷並生成某個字符串。 可以說我有這棵樹遍歷/變換表達式樹
OR
/\
AND C
/ \
A B
而且我希望把它改造成:
(A AND B) OR C
我想在序遍歷使用,但是這不正是我將要去的需要。
我有一個表達式樹,我需要遍歷並生成某個字符串。 可以說我有這棵樹遍歷/變換表達式樹
OR
/\
AND C
/ \
A B
而且我希望把它改造成:
(A AND B) OR C
我想在序遍歷使用,但是這不正是我將要去的需要。
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)
}
最簡單的解決打印冗餘括號:
Visit(node):
Output "("
If node.has_left():
Visit(node.left)
Output node.label
If node.has_right():
Visit(node.right)
Output ")"
要解決該冗餘括號問題,分配各操作者左和右優先級,正如運算符優先級解析,並通過親節點的訪問優先級。只有當訪問節點的優先級低於從父節點傳入的優先級時,訪問纔會輸出括號。
你想在java或c#中實現或只是算法?用戶合適的標籤 – Panther
在您看來,爲了遍歷遍歷,有什麼問題? – rici
@Panther語言甚至無關緊要,即使僞代碼也沒有問題 – Tamerlane