簡體   English   中英

遍歷/變換表達式樹

[英]Traverse/Transform the expression tree

我有一個表達式樹,需要遍歷並生成某個字符串。 可以說我有這棵樹

     OR
    /  \
  AND   C
 /   \
A     B

我想將其轉換為:

(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 ")"

要解決冗余括號問題,請像在運算符優先級解析中一樣,為每個運算符分配一個左右優先級,然后將父節點的優先級傳遞給訪問。 然后,僅當訪問節點的優先級低於從父節點傳遞的優先級時,訪問才會輸出括號。

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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM