后缀表达式:ab+cde+**
转换的表达式树:
转换步骤:
如果符号是操作数,那么就建立一个单节点树并将它推入栈中。
如果符号是操作符,那么就从栈中弹出两颗树 T1 和 T2 (T1 先弹出)并形成一棵新的树,该树的根就是操作符,它的左、右儿子分别是 T2 和 T1。然后将这颗新树压入栈中。
代码示例
import java.util.Stack;/*** 后缀表达式转换成表达式数* @author GongQiang**/
public class PostExpressionToTree {private Stack<TreeNode> stack = new Stack<TreeNode>();/*** @param args** Date :2012-6-27* Author :GongQiang*/public static void main(String[] args) {String postExpression = "ab+cde+**";PostExpressionToTree pett = new PostExpressionToTree();System.out.println( pett.transform( postExpression ) );}public String transform( String postExp ){for( int i=0 ; i<postExp.length() ; i++ ){char c = postExp.charAt(i);if( operandChar(c) ){TreeNode root = TreeNode.buildNode(c);TreeNode rightChild = stack.pop();TreeNode leftChild = stack.pop();root.setLeftChild( leftChild );root.setRightChild( rightChild );stack.push( root );}else{stack.push( TreeNode.buildNode(c) );}}// 打印表达式树StringBuilder sb = new StringBuilder();printTree( sb, stack.pop() );return sb.toString();}/*** 中序遍历打印* @param node* @return** Date :2012-6-27* Author :GongQiang*/private void printTree( StringBuilder sb,TreeNode node ){if( node.leftChild != null ){printTree( sb, node.leftChild );}sb.append( node.c );if( node.rightChild != null ){printTree( sb, node.rightChild );}}/*** 是操作符 ?* @return** Date :2012-6-26* Author :GongQiang*/private boolean operandChar( char c ){char[] operands = { '+', '*', '(', ')' };for( char op : operands ){if( c == op ){return true;}}return false;}/*** 构造数的节点类* @author GongQiang**/static class TreeNode{char c;TreeNode leftChild;TreeNode rightChild;public TreeNode getLeftChild() {return leftChild;}public void setLeftChild(TreeNode leftChild) {this.leftChild = leftChild;}public TreeNode getRightChild() {return rightChild;}public void setRightChild(TreeNode rightChild) {this.rightChild = rightChild;}private TreeNode(char c, TreeNode leftChild, TreeNode rightChild) {super();this.c = c;this.leftChild = leftChild;this.rightChild = rightChild;}static TreeNode buildNode( char c ){return new TreeNode( c, null, null );}static TreeNode buildNode( char c, TreeNode leftChild, TreeNode rightChild ){return new TreeNode( c, leftChild, rightChild );}}}