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

 

posted @ 2019-01-02 02:17  zhuangrunwei  阅读(1849)  评论(0编辑  收藏  举报