后缀表达式: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 );
}
}
}