我正在研究一个项目,在我的项目中,我必须构建一棵树。树将有大约64000片叶子。不幸的是,我一直遇到stackoverflow错误,我不知道该做什么。我是否将错误的递归方法写入错误或是否有错误的解决方法? 构造函数中的代码:
for(int i = 0; i < wordHolder.size(); i++) {
add(i);
}
添加方法:
public void add(int i){
mainTreeNode = treeSetup(mainTreeNode, 0, wordHolder.get(i), countHolder.get(i));
}
和设置树的递归方法:
private TreeNode treeSetup(TreeNode node, int letterCount, String s, List<Integer> i) {
if(letterCount == 26) {
letterCount = 0;
}
if(node == null) {
node = new TreeNode(s,i);
} else if (i.get(letterCount) >= node.test.get(letterCount)) {
node.right = treeSetup(node.right, letterCount++, s, i);
} else if(i.get(letterCount) < node.test.get(letterCount)) {
node.left = treeSetup(node.left, letterCount++, s, i);
}
return node;
}
节点是包含2个数据结构(列表和字符串)的标准节点。我们的想法是根据列表包含的内容将节点放入某个位置。此外,树中的每个级别都基于列表中的不同值(如KD树)进行检查,因此也是letterCount变量。
中似乎存在问题node.right = treeSetup(node.right, letterCount++, s, i);`
行,但会根据&#34; if语句&#34;进行更改。有&#34; =&#34;标志。如果我删除&#34; =&#34;来自&#34;如果陈述&#34;问题消失但我失去了很大的准确性。请帮助
答案 0 :(得分:0)
这是Java吗?你没有指定,但它看起来像。除了最佳实践问题,我看到的一件事是2,如果是,如果你必须这样做,如果是,如果if if else for Java。然而,案例转换可能对本研究更好。
构造函数中应该包含for循环。构造函数应该是一个蓝图,您可以调用它来构建对象的实例。它只是包含所有参考和信息,为您提供骨架。然后你用其他方法给它一些肉。
我个人首先要尝试的是让Treenode treeSetup更像是构造函数实例的初始化器。让它获取参数并将它们传递给需要它们设置其唯一性的对象实例。将for循环放在void方法中,构建你的Params以传递给void中的Treenode方法,然后将所有信息传递给它,让它为你设置所有的好东西。
对于节点本身的设置,有更好的方法来做到这一点,但快速和肮脏
if (letterCount == 26) {
letterCount = 0;
}
if (node != null) {
if (letterCount %2 == 0) {
do left stuff
} else {
do right stuff
}
}
return
否则如果有效,但老实说,如果你能找到一种方法来使用枚举或开关盒,那就更现代了。 您应该关注的另一件事是,您是以一种奇怪的方式使用2种数据类型,对于包含键和值的2种数据类型,已经存在一个完美的项目。
https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html