zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 695 岛屿的最大面积(DFS)
    Java实现 LeetCode 695 岛屿的最大面积(DFS)
    PHP serialize() 函数
    PHP print_r() 函数
  • 原文地址:https://www.cnblogs.com/Mike_Chang/p/10206757.html
Copyright © 2011-2022 走看看