标签:ring lse string 节点 view closed class inf his
概述
表达式树的特点:叶节点是操作数,其他节点为操作符。
由于一般的操作符都是二元的,所以表达式树一般都是二叉树。
根据后缀表达式"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;} }
标签:ring lse string 节点 view closed class inf his
原文地址:https://www.cnblogs.com/Mike_Chang/p/10206757.html