我正在开发一个涉及四叉树的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++;
}
}
}
我相信你的问题是你没有正确增加
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;
}