2016-03-04 35 views
0

我最近一直在研究java中的樹。我在sanfoundry.com上發現了這個代碼,這對於表達式樹來說非常棒。它需要一個前綴,然後打印出前綴表達式看起來像一箇中綴和一個後綴,然後打印出答案。我的問題是我想弄清楚如何簡化它,只需要一個後綴,並打印出答案。因此,不用閱讀前綴並完成所有這些,只需在後綴中讀取並打印出答案即可。以下是我找到的代碼。這是一個簡單的修復,只是讓它做postfix?還是更難?用於後綴表達式樹的Java程序

class ExpressionTree 
{ 
/** class TreeNode **/ 
class TreeNode 
{  
    char data; 
    TreeNode left, right; 

    /** constructor **/ 
    public TreeNode(char data) 
    { 
     this.data = data; 
     this.left = null; 
     this.right = null; 
    } 
} 

/** class StackNode **/ 
class StackNode 
{ 
    TreeNode treeNode; 
    StackNode next; 

    /** constructor **/ 
    public StackNode(TreeNode treeNode) 
    { 
     this.treeNode = treeNode; 
     next = null; 
    } 
} 

private static StackNode top; 

/** constructor **/ 
public ExpressionTree() 
{ 
    top = null; 
} 

/** function to clear tree **/ 
public void clear() 
{ 
    top = null; 
} 

/** function to push a node **/ 
private void push(TreeNode ptr) 
{ 
    if (top == null) 
     top = new StackNode(ptr); 
    else 
    { 
     StackNode nptr = new StackNode(ptr); 
     nptr.next = top; 
     top = nptr; 
    } 
} 

/** function to pop a node **/ 
private TreeNode pop() 
{ 
    if (top == null) 
     throw new RuntimeException("Underflow"); 
    else 
    { 
     TreeNode ptr = top.treeNode; 
     top = top.next; 
     return ptr; 
    } 
} 

/** function to get top node **/ 
private TreeNode peek() 
{ 
    return top.treeNode; 
} 

/** function to insert character **/ 
private void insert(char val) 
{ 
    try 
    { 
     if (isDigit(val)) 
     { 
      TreeNode nptr = new TreeNode(val); 
      push(nptr); 
     } 
     else if (isOperator(val)) 
     { 
      TreeNode nptr = new TreeNode(val); 
      nptr.left = pop(); 
      nptr.right = pop(); 
      push(nptr); 
     } 
    } 
    catch (Exception e) 
    { 
     System.out.println("Invalid Expression"); 
    } 
} 

/** function to check if digit **/ 
private boolean isDigit(char ch) 
{ 
    return ch >= '0' && ch <= '9'; 
} 

/** function to check if operator **/ 
private boolean isOperator(char ch) 
{ 
    return ch == '+' || ch == '-' || ch == '*' || ch == '/'; 
} 

/** function to convert character to digit **/ 
private int toDigit(char ch) 
{ 
    return ch - '0'; 
} 

/** function to build tree from input */ 
public void buildTree(String eqn) 
{ 
    for (int i = eqn.length() - 1; i >= 0; i--) 
     insert(eqn.charAt(i)); 
} 

/** function to evaluate tree */ 
public double evaluate() 
{ 
    return evaluate(peek()); 
} 

/** function to evaluate tree */ 
public double evaluate(TreeNode ptr) 
{ 
    if (ptr.left == null && ptr.right == null) 
     return toDigit(ptr.data); 
    else 
    { 
     double result = 0.0; 
     double left = evaluate(ptr.left); 
     double right = evaluate(ptr.right); 
     char operator = ptr.data; 

     switch (operator) 
     { 
     case '+' : result = left + right; break; 
     case '-' : result = left - right; break; 
     case '*' : result = left * right; break; 
     case '/' : result = left/right; break; 
     default : result = left + right; break; 
     } 
     return result; 
    } 
} 

/** function to get postfix expression */ 
public void postfix() 
{ 
    postOrder(peek()); 
} 

/** post order traversal */ 
private void postOrder(TreeNode ptr) 
{ 
    if (ptr != null) 
    { 
     postOrder(ptr.left);    
     postOrder(ptr.right); 
     System.out.print(ptr.data);    
    }  
} 

/** function to get infix expression */ 
public void infix() 
{ 
    inOrder(peek()); 
} 

/** in order traversal */ 
private void inOrder(TreeNode ptr) 
{ 
    if (ptr != null) 
    { 
     inOrder(ptr.left); 
     System.out.print(ptr.data); 
     inOrder(ptr.right);    
    }  
} 

/** function to get prefix expression */ 
public void prefix() 
{ 
    preOrder(peek()); 
} 

/** pre order traversal */ 
private void preOrder(TreeNode ptr) 
{ 
    if (ptr != null) 
    { 
     System.out.print(ptr.data); 
     preOrder(ptr.left); 
     preOrder(ptr.right);    
     }  
    } 
} 

這裏是主要的方法。

/** class ExpressionTreeTest **/ 
    public class ExpressionTreeTest 
    { 
    public static void main(String[] args) 
    { 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Expression Tree Test"); 

    /** make object of ExpressionTree **/ 
    ExpressionTree et = new ExpressionTree(); 

    System.out.println("\nEnter equation in prefix form"); 
    et.buildTree(scan.next()); 

    System.out.print("\nPrefix : "); 
    et.prefix(); 
    System.out.print("\n\nInfix : "); 
    et.infix(); 
    System.out.print("\n\nPostfix : "); 
    et.postfix(); 
    System.out.println("\n\nEvaluated Result : "+ et.evaluate()); 
    } 
    } 

回答

0

Postfix是一種線性符號。你根本不需要樹來評估它,只需要一個堆棧。你從錯誤的地方開始。

+0

是的,我明白了。我已經使用堆棧創建了一個後綴。我只是想知道使用它可以使它成爲後綴樹嗎? –

+0

沒有這樣的後綴樹。這是一種線性符號。你可以有一個*表達式*樹,它的操作符作爲父項和操作數作爲子元素,你可以用前綴,中綴或後綴順序遍歷它:不是一回事。你的問題很困惑。 – EJP

+0

好的,謝謝我現在開始明白了。所以這適用於前綴,並能夠計算它,正確?那麼你是說這是可能的前綴,但不適用於後綴?或者我以錯誤的方式提問?對不起所有的問題。我只想完全理解這一點。 –