如何防止堆栈溢出错误?

问题描述 投票:0回答:1

我正在开发一个涉及四叉树的Java项目。
在四叉树的这种表示中,强度为 -1 的节点有 4 个子节点,而具有任何其他强度的节点没有子节点。我得到了四叉树的前序遍历,并要求将其转换为树本身。前序遍历在一个文件中提供给我(每一行包含一个数字)。我不断遇到堆栈溢出错误,因为在我的方法中我使用递归并且文件有 79,917 个数字。

这是我写的方法。它适用于较小的文件/但在较大的文件上会崩溃。
在这个方法中,它接收一个包含四叉树的前序遍历的数组

public void createQT(Integer[] numbers){
    createQT(numbers, 1, root);
}

private void createQT(Integer[] numbers, int index, QTNode currentParent) {
    if (index >= numbers.length || numbers[index] == null) {
        return;
    }

    QTNode node = new QTNode();
    if (numbers[index] != -1) {
        node.setIntensity(numbers[index]);
        currentParent.addChild(node);
        createQT(numbers, index + 1, currentParent); 
    } else {
        currentParent.addChild(node);
        index++;
        for (int i = 0; i < 4; i++) {
            createQT(numbers, index, node); 
            index++;
        }
    }
}
java recursion data-structures stack-overflow recursive-datastructures
1个回答
0
投票

我相信你的问题是你没有正确增加

index
:如果你发现一个有四个子节点的节点,对
createQT
的调用可能会使其增加超过 1。尝试返回下一个节点的索引:

private int createQT(Integer[] numbers, int index, QTNode currentParent) {
    if (index >= numbers.length || numbers[index] == null) {
        return index;
    }

    QTNode node = new QTNode();
    if (numbers[index] != -1) {
        node.setIntensity(numbers[index]);
        currentParent.addChild(node);
        index = createQT(numbers, index + 1, currentParent); 
    } else {
        currentParent.addChild(node);
        for (int i = 0; i < 4; i++) {
            index++;
            index = createQT(numbers, index, node); 
        }
    }
    return index;
}
© www.soinside.com 2019 - 2024. All rights reserved.