2013-11-26 77 views
0

可以说我给这个方法提供了这个字符串列表:[*,+,8,4, - ,7,/,6,3]。 及其与下面的方法不正确的结构是:在java中创建二进制表达式树

|-- * 
    |-- + 
     |-- 8 
     |-- 4 
    |-- 8 

我知道此时的方法炸毁。当左右两边最终都是数字时,它就会从前一次递归中输入新节点。

我该如何避免这种情况,并将它添加到对方的节点中,而不是再次输入newnode?

public ExpressionTreeNode createExpressionTree(List<String> listofstrings) 
{ 
     ExpressionTreeNode newnode = new ExpressionTreeNode(listofstrings.get(0)); 

     if(!newnode.isanumber(newnode)) 
     { 
      if(root == null) 
      { 
      root = newnode; 
      } 
      listofstrings = removefirst(listofstrings); 
      newnode.left = createExpressionTree(listofstrings); 
      listofstrings = removefirst(listofstrings); 
      newnode.right =createExpressionTree(listofstrings); 
      //listofstrings = removefirst(listofstrings); 
     }  

      return newnode; // should only be number leaves 
} 
+0

你有6个(几乎相同)的问题,但你没有把任何人花时间帮助你。 - 因为你永远不会显示你的'ExpressionTreeNode',我恐怕你今晚也不会得到一个好的答案。 – Ingo

+0

因为我的声望很低,所以我无法上任何一个。该节点只是一个带有String数据的标准二进制节点,节点向左,向右; – jakeinmn

+1

如果您从未[*接受*](http://stackoverflow.com/help/accepted-answer)答案,您的声誉将保持低水平。 – Holger

回答

0

我都还是决定帮你一次:

删除的

listofstrings = removefirst(listofstrings); 

第二occurence在这里,你如雨后春笋般冒出的元素,但它只是丢失,因此您的树不正确。请记住,我们已经找出了构建树的正确方法。

顺便说一句,什么是

  if(root == null) 
     { 
     root = newnode; 
     } 

这将你的漂亮,清纯,回归法的一些具体的全局变量,使得它有副作用的垃圾! 如果您需要指定在某处建树的结果,为何不简单在首先调用createExpressionTree的地方执行此操作。

ExpressionTree root = createExpressionTree(tokenList); 
+0

我使用了root == null,因为我的方法设置了当前节点的左右节点。如果您的意思是在主构造函数中使用叶和Expr树构建树的正确方法,那么我的教授告诉我可以比构建抽象方法更简单。我也尝试过使用removefirst函数,但它需要它。树只能使用(+ 1 1),一个运算符表达式来生成树。 – jakeinmn

+0

@jakeinmn是的,第一个'removefirst'是需要的,当然在去到子树之前。但不是递归调用之间的那个。并且,第一个'removefirst'必须在消耗完令牌后立即放置(理想情况下,会有一个方法list.pop(),但是我们使用list.get(0)来完成,然后该元素必须被移除)。 – Ingo