概述
表达式树的特点:叶节点是操作数,其他节点为操作符。
由于一般的操作符都是二元的,所以表达式树一般都是二叉树。
根据后缀表达式"ab+cde+**"建立一颗树
文字描述:
如同后缀表达式求值一样,逐个读取后缀表达式的每一个符号,
如果遇到操作数,建立一个节点把操作数的值加入这个节点,并把节点入栈;
如果遇到操作符,弹出栈里的两个节点,并赋值为自己的左子节点、右子节点,最后把这个节点树入栈。
画图描述:
1、读入操作数a,创建节点,压入栈;读入操作数b,创建节点,压入栈
2、遇到操作符“+”,弹出栈内的两个节点;创建一个新节点;把“+”赋值给新节点,新节点的左节点、右节点分别赋值为刚弹出的两个节点;新节点入栈
3、读入操作数c,创建节点,压入栈……
4、遇到操作符“+”,弹出栈内的两个节点;创建一个新节点;把“+”赋值给新节点,新节点的左节点、右节点分别赋值为刚弹出的两个节点;新节点入栈(和第2步相同)
5、遇到操作符“*”,弹出栈内的两个节点;创建一个新节点;把“*”赋值给新节点,新节点的左节点、右节点分别赋值为刚弹出的两个节点;新节点入栈(和第2步相同)
6、好了
代码实现:
importjava.util.Stack;public classTest {//前缀表达式 +ab**+cde//中缀表达式 (a+b)*((c+d)*e)//后缀表达式
static String expression = "ab+cde+**";static Stack stack = newStack();public static voidmain(String[] args) {
Tree tree=createTree(expression);//后序遍历输出树
travTree(tree.root);
}private static voidtravTree(Node node) {
Node currentNode=node;if (currentNode != null) {
travTree(currentNode.leftChild);
travTree(currentNode.rightChild);
System.out.print(node.element);
}
}//把后缀表达式转化为一颗树
private staticTree createTree(String expression) {for (int i = 0; i < expression.length(); i++) {char ch =expression.charAt(i);if (ch != ‘+‘ && ch != ‘-‘ && ch != ‘*‘ && ch != ‘/‘) {
Node node= newNode(ch);
stack.push(node);
}else{
Node node= newNode(ch);
Node rightNode=(Node)stack.pop();
Node leftNode=(Node)stack.pop();
node.setLeftChild(leftNode);
node.setRightChild(rightNode);
stack.push(node);
}
}return newTree((Node) stack.pop());
}
}classNode {charelement;
Node leftChild;
Node rightChild;
Node(charelement) {this.element =element;
}void setLeftChild(Node leftChild) { this.leftChild =leftChild; }void setRightChild(Node rightChild) { this.rightChild =rightChild; }
}classTree {
Node root;
Tree(Node root) {this.root =root;}
}
View Code
原文:https://www.cnblogs.com/Mike_Chang/p/10206757.html