让我们说这个字符串列表提供此方法:[*,+,8,4, - ,7,/,6,3]。 使用以下方法的错误结构是:
|-- *
|-- +
|-- 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 :(得分:0)
但我决定再帮你一次:
删除
的第二次出现listofstrings = removefirst(listofstrings);
在这里,你弹出一个元素,但它会丢失,因此你的树是不正确的。 请记住,我们已经找到了构建树的正确方法。
BTW,
是什么垃圾 if(root == null)
{
root = newnode;
}
这将你漂亮,纯粹的递归方法耦合到某个特定的全局变量,并使其产生副作用!
如果您需要在某处分配构建树的结果,为什么不在您首先调用createExpressionTree
的地方进行。
ExpressionTree root = createExpressionTree(tokenList);