构建和巨大的树,并被堆栈溢出错误

时间:2017-08-05 05:40:21

标签: java tree binary-tree stack-overflow large-data

我正在研究一个项目,在我的项目中,我必须构建一棵树。树将有大约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;问题消失但我失去了很大的准确性。请帮助

1 个答案:

答案 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