网上找半天都没找着一个像样的,所以自己动手写了一个
import java.util.Scanner;
public class TreeExpress{
private int index;
class Node{
Node Left;
Node Right;
String str;
}
public static void main(String args[]){
Scanner sn = new Scanner(System.in);;
String str = sn.nextLine();
TreeExpress te = new TreeExpress();
te.To_Mid_Express(str.split(""));
}
public void To_Mid_Express(String str[]){
Node node = Transition(str);
index = 0;
pri_Mid(node);
System.out.println();
this.WriteExpr(node);
}
public Node Transition(String str[]){
Node node = null;
if(index<str.length){
node = new Node();
node.str = str[index];
if(index+1<str.length && isToken(str[index+1].charAt(0)) && isOperator(str[index])){
node.Left = new Node();
node.Left.str = str[++index];
if(isToken(str[index+1].charAt(0))){
node.Right = new Node();
node.Right.str = str[++index];
}
}else{
index++;
node.Left = Transition(str);
index++;
node.Right = Transition(str);
}
}
return node;
}
/*用带括弧的中缀表达式输出表达式*/
void WriteExpr(Node E)
{
if(E!=null)/*树不为空*/
{ /*先递归左子树*/
if(E.Left!=null)//E的左孩子不为空
{
if(Pri_Compare(E.str,E.Left.str))//优先比较
{
System.out.print("(");
WriteExpr(E.Left);
System.out.print(")");
}
else WriteExpr(E.Left);/*否则,不带括弧输出左子树*/
}
System.out.print(E.str);
/*后递归右子树*/
if(E.Right != null)//E的右孩子不为空
{
if(Pri_Compare(E.str,E.Right.str))//优先比较
{
System.out.print("(");
WriteExpr(E.Right);
System.out.print(")");
}
else WriteExpr(E.Right);/*否则,不带括弧输出右子树*/
}
}
}
boolean Pri_Compare(String a,String b){
if((a.equals("^") ||a.equals("*")||a.equals("-")||a.equals("+")||a.equals("/"))&&(b.equals("^")||b.equals("*")||b.equals("-")||b.equals("+")||b.equals("/")))
{/*c1和c2为运算符*/
if(a.equals("^"))/*a为指数运算符,则当b不为'^'时,a比b优先*/
{
if(b.equals("^")) return true;
else return false;
}
else if(a.equals("*")||a.equals("/"))/*a为乘法或除法运算符,则当b为'+'或'-',a比b优先*/
{
if(b.equals("^") || b.equals("*")||b.equals("/"))return false;
else return true;
}
else return false;/*其余,a不比b优先*/
}
else return false;/*a和b不是运算符*/
}
public void pri_Mid(Node node){
if(node!=null){
pri_Mid(node.Left);
System.out.print(node.str);
pri_Mid(node.Right);
}
}
boolean isOperator(String total){
return (total.equals("+") || total.equals("-")|| total.equals("*")|| total.equals("/")|| total.equals("^"));
}
boolean isToken(char c)
{
return(((c >='A') && (c <= 'Z'))||((c >= 'a')&& (c <= 'z')) || ((c >= '0')&& (c <= '9')));
}
}