Java實現后綴表達式建立表達式樹


概述

表達式樹的特點:葉節點是操作數,其他節點為操作符。
由於一般的操作符都是二元的,所以表達式樹一般都是二叉樹。


根據后綴表達式"ab+cde+**"建立一顆樹

文字描述:

如同后綴表達式求值一樣,逐個讀取后綴表達式的每一個符號,
如果遇到操作數,建立一個節點把操作數的值加入這個節點,並把節點入棧;
如果遇到操作符,彈出棧里的兩個節點,並賦值為自己的左子節點、右子節點,最后把這個節點樹入棧。

畫圖描述

1、讀入操作數a,創建節點,壓入棧;讀入操作數b,創建節點,壓入棧

      

2、遇到操作符“+”,彈出棧內的兩個節點;創建一個新節點;把“+”賦值給新節點,新節點的左節點、右節點分別賦值為剛彈出的兩個節點;新節點入棧

3、讀入操作數c,創建節點,壓入棧……

4、遇到操作符“+”,彈出棧內的兩個節點;創建一個新節點;把“+”賦值給新節點,新節點的左節點、右節點分別賦值為剛彈出的兩個節點;新節點入棧(和第2步相同)

5、遇到操作符“*”,彈出棧內的兩個節點;創建一個新節點;把“*”賦值給新節點,新節點的左節點、右節點分別賦值為剛彈出的兩個節點;新節點入棧(和第2步相同)

6、好了

代碼實現

import java.util.Stack;

public class Test {
    // 前綴表達式 +ab**+cde
    // 中綴表達式 (a+b)*((c+d)*e)
    // 后綴表達式
    static String expression = "ab+cde+**";
    static Stack stack = new Stack();
    public static void main(String[] args) {
        Tree tree = createTree(expression);
        // 后序遍歷輸出樹
        travTree(tree.root);
    }
    private static void travTree(Node node) {
        Node currentNode = node;
        if (currentNode != null) {
            travTree(currentNode.leftChild);
            travTree(currentNode.rightChild);
            System.out.print(node.element);
        }
    }
    // 把后綴表達式轉化為一顆樹
    private static Tree createTree(String expression) {
        for (int i = 0; i < expression.length(); i++) {
            char ch = expression.charAt(i);
            if (ch != '+' && ch != '-' && ch != '*' && ch != '/') {
                Node node = new Node(ch);
                stack.push(node);
            } else {
                Node node = new Node(ch);
                Node rightNode = (Node)stack.pop();
                Node leftNode = (Node)stack.pop();
                node.setLeftChild(leftNode);
                node.setRightChild(rightNode);
                stack.push(node);
            }
        }
        return new Tree((Node) stack.pop());
    }
}
class Node {
    char element;
    Node leftChild;
    Node rightChild;
    Node(char element) {
        this.element = element;
    }
    void setLeftChild(Node leftChild) { this.leftChild = leftChild; }
    void setRightChild(Node rightChild) { this.rightChild = rightChild; }
}
class Tree {
    Node root;
    Tree(Node root) { this.root = root;}
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM