검색 할 필요가있는 이진 트리가 있습니다. 나는 트리의 특정 노드를 검색하지 않고 트리의 모든 노드를 검색하여 정보를 얻습니다. 지금은 간단한 재귀 검색이 있지만 실행될 때마다 스택 오버플로 오류가 발생합니다. 그것은 ... 깊이 7의 전체 이진 트리의이진 트리 검색 알고리즘 오류
if (curDepth < 6 && !searchedNodes[curID * 2])
depthSearch(curNode.getRight());
if (curDepth < 6 && !searchedNodes[curID * 2 + 1])
depthSearch(curNode.getLeft());
if (curID != 1 && !searchedNodes[(int) (curID/2)])
depthSearch(curNode.getParent());
curID == 1은 루트 노드에 해당하는, 그래서 그것을 부모 을 아니라고 확인해야합니다. searchedNodes 건 내가 동일한 노드를 두 번 검색하지 않도록하는 것입니다. 이 작업을 수행하는 방법에 대한 아이디어가 있습니까?
편집 : 여기에 전체 검색 방법
public void depthSearch(AntTree curNode) {
boolean[] searchedNodes = new boolean[128];
if (curNode == null)
return;
int curID = curNode.getID();
searchedNodes[curID] = true;
if (curNode.getFood() > 0) {
AntScript.foodLocs[curID] = 1;
} else {
Ant6Script.foodLocs[curID] = 0;
}
Ant[] ants = curNode.getAnts();
boolean containsWorker = false, containsSoldier = false;
if (ants != null) {
for (int i = 0; i < ants.length; i++) {
if (ants[i].type().equals("Worker")
&& ants[i].teamID() != AntScript.myTeamID) {
containsWorker = true;
} else if (ants[i].type().equals("Soldier")
&& ants[i].teamID() != AntScript.myTeamID) {
containsSoldier = true;
} else if (ants[i].type().equals("Queen")
&& ants[i].teamID() != AntScript.myTeamID) {
AntScript.enemyQueenLoc = curID;
}
}
}
if (containsWorker)
AntScript.enemyWorkerLocs[curID] = 1;
else
AntScript.enemyWorkerLocs[curID] = 0;
if (containsSoldier)
AntScript.enemySoldierLocs[curID] = 1;
else
AntScript.enemySoldierLocs[curID] = 0;
AntScript.viewedNodeLocs[curID] = 1;
int curDepth = (int) (Math.log(curID)/Math.log(2));
if (AntScript.viewedNodeLocs[(int) (curID/2)] == 0
|| (curDepth < 6 && AntScript.viewedNodeLocs[curID * 2 + 1] == 0)
|| (curDepth < 6 && AntScript.viewedNodeLocs[curID * 2] == 0)) {
if (curDepth < 6
&& AntScript.viewedNodeLocs[curID * 2] == 0
&& !searchedNodes[curID * 2]) {
depthSearch(curNode.getLeft());
}
if (curDepth < 6
&& AntScript.viewedNodeLocs[curID * 2 + 1] == 0
&& !searchedNodes[curID * 2 + 1]) {
depthSearch(curNode.getRight());
}
if (curID != 1
&& AntScript.viewedNodeLocs[(int) (curID/2)] == 0
&& !searchedNodes[(int) (curID/2)]) {
depthSearch(curNode.getParent());
}
} else {
if (curDepth < 6 && !searchedNodes[curID * 2]) {
depthSearch(curNode.getRight());
}
if (curDepth < 6 && !searchedNodes[curID * 2 + 1]) {
depthSearch(curNode.getLeft());
}
if (curID != 1 && !searchedNodes[(int) (curID/2)]) {
depthSearch(curNode.getParent());
}
}
}
내가 다른 노드에서 검색을 수행하는 보드에 많은 개미를 가지고 있고,을 통해 검색 할 더 나은 때문에 viewedNodeLocs 배열의 목적은
입니다 노드는 이전에 검색되지 않은 노드입니다. 다음 노드에 대한 내 요청이 하나의 개미 (이 모든 것은 게임을 프로그래밍하는 개미 AI의 것임)에서 13 번 요청한 후에 null을 반환해야하기 때문에 큰 검색을 한 번 수행 할 수 없습니다.
정보가 충분하지 않습니다. 전체 재귀 검색 루틴을 게시하십시오. –
죄송합니다. 업데이트되었습니다. – Sean
실제로 무엇을하려고하는지에 대한 설명이 없으므로 작성한 것을 평가하기가 어렵습니다. 이것은 비교적 간단한 문제가 무엇인지에 대해 매우 복잡해 보이며 명백한 오류가 있습니다. 가장 중요한 것은 각 재귀 호출이 searchedNodes의 자체 복사본을 만들어 정확히 하나의 요소를 설정한다는 것입니다.추가 테스트는 현재 호출의 searchedNodes 만보고 다른 호출에 의해 설정된 값은 보지 못합니다. 목표에 대한 설명을 게시 할 수 있습니까? –