2013-11-27 107 views
1
import java.util.ArrayList; 
import java.util.List; 

public class ExpressionTree { 

List<String> expArray = new ArrayList<String>(); 
ExpressionTreeNode root; 
ExpressionTreeNode curNode; 
ExpressionTreeNode left; 
ExpressionTreeNode right; 
String element; 

public ExpressionTree(String prefixExpression) { 
    String[] temp = prefixExpression.split(" "); 
    for (int i = 0; i < temp.length; i++) { 
     expArray.add(temp[i]); 
    } 
    root = createExpressionTree(expArray); 
    System.out.println(root); 
} 

private ExpressionTreeNode createExpressionTree(List<String> prefixExpression) { 
    element = prefixExpression.get(0); 
    prefixExpression.remove(0); 
    if (isNumeric(element)) { 
     return new Leaf(Double.parseDouble(element)); 
    } else { 
     left = createExpressionTree(prefixExpression); 
     right = createExpressionTree(prefixExpression); 
    } 
    return new ExpressionTreeNode(left, right, element); 
} 

private static boolean isNumeric(String str) { 
    try { 
     double d = Double.parseDouble(str); 
    } catch(NumberFormatException nfe) { 
     return false; 
    } 
    return true; 
} 

} 

這是我的代碼,我想返回一個表達式樹給像* 5 + 4的表達式時 - 3/2 1.我越來越雖然輸出是這樣的:從前綴符號構建二進制表達式樹?

1 
|\ 
2 1 
    /\ 
    2 1 
    /\ 
    2 1 

當我試圖得到:

 * 
    /\ 
    + - 
    /\ /\ 
    5 4 3/
      /\ 
      2 1 

任何提示?爲什麼我的樹的唯一元素是表達式的最後兩個元素?我覺得我失去了一些明顯的東西。

+0

[解析一個算術表達式,並從它在Java中建立一個樹]的可能重複(http://stackoverflow.com/questions/4589951/parsing-an-arithmetic-expression-and-building-a- tree-from-it-in-java) – EJP

回答

0

您正在使用字段來存儲表達式節點程序集的中間結果。這些會在您正在使用的遞歸調用createExpressionTree(...)中被覆蓋。

如果修改方法以使用局部變量作爲臨時值,那麼一切都應該正常工作(您也可以從類定義中刪除字段)。

private ExpressionTreeNode createExpressionTree(List<String> prefixExpression) { 
    String element = prefixExpression.get(0); 
    prefixExpression.remove(0); 
    if (isNumeric(element)) { 
     return new Leaf(Double.parseDouble(element)); 
    } 
    ExpressionTreeNode left = createExpressionTree(prefixExpression); 
    ExpressionTreeNode right = createExpressionTree(prefixExpression); 
    return new ExpressionTreeNode(left, right, element); 
} 
+0

樹仍然是所有時髦:/ – user2998228

+0

你能告訴我你在得到什麼嗎?隨着變化,我得到了像'Node(*)[Node(+)[Leaf [5.0],Leaf [4.0]],Node( - )[Leaf [3.0],Node(/)[Leaf [2.0],葉[1.0]]]]'這看起來對我來說很合適。 – msandiford

+0

沒關係,它工作!謝謝 – user2998228