2016-05-02 4 views
0

BSTの最も深いノードを返すメソッドがあります。なぜそれがエラーを上げている、それが正常に見える私にJavaのバイナリ検索ツリーを走査中のStackOverflowError

public int getDeepestNode(AvlNode head) { 
    if (head == null) { 
     return 0; 
    } else { 
     return (Math.max(getDeepestNode(head.getLeftNode()), getDeepestNode(head.getRightNode())) + 1); 
    } 
} 

:私はStackOverflowのエラーを発生させ、このコードを持っていますか?

+1

BSTにはループがあります。つまり、* left *または* right *ノードの1つがツリーの上位ノードを指しています。それともあなたの木は非常にバランスがとれていないし、非常に深いです。 – Codo

+1

@Codo ...または他の方法の1つに問題があります。また、 'getLeftNode()'と 'getRightNode()'のように投稿する必要があります。 – cst1992

+1

最初にツリーのトラバースを確認するには、少なくとも基本的なチェックを行う必要があります。実行を追跡するためにルーチンの上部に簡単なprint文を挿入します:** print head **。その値を印刷すると読みやすくなります。これにより、ツリー内にループがあるかどうか、コード内で適切な再帰がないかどうか、またはその他の問題があるかどうかを簡単に確認できます。 – Prune

答えて

2

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; 
    } 
} 

は間違いなく良いだろうが、このコードで、あなたはより速く(またはしない)エラーを見つけるかもしれません。

関連する問題