getDeepestNodeはスタック上で繰り返し発生する必要があります。
おそらくAVLツリーに1つのサイクルがあります。命名、head
は、既に汚れた考えを示すかもしれません。デバッグが役立ちます。また、あなたのようにあなたのコードを固めるかもしれません :
IllegalStateExceptionがを投げる
public int getDeepestNode(AvlNode head) {
return getDeepestNodeSafe(head, new ArrayList<AvlNode>());
}
public int getDeepestNodeSafe(AvlNode head, List<AvlNode> pathFromRoot) {
if (head == null) {
return 0;
} else {
if (pathFromRoot.contains(head)) {
StringBuilder sb = new StringBuilder("Cycle: ");
for (AvlNode node : pathFromRoot) {
if (node == head) {
sb.append("***");
}
sb.append(node).append("; ");
}
Logger.getLogger(getClass().getName()).log(Level.WARN, sb.toString());
return 0;
}
pathFromRoot.add(head);
int depth = Math.max(getDeepestNodeSafe(head.left, pathFromRoot),
getDeepestNodeSafe(head.right), pathFromRoot) + 1;
pathFromRoot.remove(pathFromRoot.size() - 1); // Undo
return depth;
}
}
は間違いなく良いだろうが、このコードで、あなたはより速く(またはしない)エラーを見つけるかもしれません。
BSTにはループがあります。つまり、* left *または* right *ノードの1つがツリーの上位ノードを指しています。それともあなたの木は非常にバランスがとれていないし、非常に深いです。 – Codo
@Codo ...または他の方法の1つに問題があります。また、 'getLeftNode()'と 'getRightNode()'のように投稿する必要があります。 – cst1992
最初にツリーのトラバースを確認するには、少なくとも基本的なチェックを行う必要があります。実行を追跡するためにルーチンの上部に簡単なprint文を挿入します:** print head **。その値を印刷すると読みやすくなります。これにより、ツリー内にループがあるかどうか、コード内で適切な再帰がないかどうか、またはその他の問題があるかどうかを簡単に確認できます。 – Prune