2017-08-05 30 views
0

即时通讯工作的项目和我的项目我必须建立一棵树。树将有大约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语句”中删除“=”符号,问题就消失了,但我失去了大量的准确性。请帮助

回答

0

这是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

+0

但是,现在为我解决这个stackoverflow问题? –

+0

另外,我必须使用kd树,问题要大得多,kd树是解决它的方法(它的基于相似性) –