建设和巨大的树,并与stackoverflow错误bug
即时通讯工作的项目和我的项目我必须建立一棵树。树将有大约64000叶子。不幸的是我一直运行到一个stackoverflow错误,我不知道该怎么做。我写错了递归方法吗?还是有错误的解决方法? 代码在构造:建设和巨大的树,并与stackoverflow错误bug
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);`
行,但基于“if语句”具有“=”符号的更改。如果我从两个“if语句”中删除“=”符号,问题就消失了,但我失去了大量的准确性。请帮助
这是Java吗?你没有指定,但它看起来像。除了最佳实践问题之外,我看到的其中一件事是2,如果是的话,如果你应该做的话,如果你还有其他问题,那么你应该这样做。然而,对于这项研究,案例切换可能会更好。
构造函数应该有for循环。构造函数应该是一个蓝图,您可以调用它来构建对象的实例。它只是提供给你一个框架的所有参考和信息。然后你用其他方法给它一些肉。
我个人想要尝试的第一件事就是让Treenode treeSetup更像构造函数实例的初始值设定项。让它获取参数并将它们传递给需要它们来设置其唯一性的对象实例。将for循环放入void方法中,建立Params以传递给虚空内的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
但是,现在为我解决这个stackoverflow问题? –
另外,我必须使用kd树,问题要大得多,kd树是解决它的方法(它的基于相似性) –