二叉树 前序转中序表达式

网上找半天都没找着一个像样的,所以自己动手写了一个

 

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')));  
 }
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值