2017-06-16 16 views
1

AVLツリーを実装しようとしています。高さメソッドでstackOverFlowを使用しています。少数の入力を試してみました。しかし、私は大規模な入力を試みたとき、それは圧倒。ここに私のコードです。AVLツリー高さメソッドStackOverFlow Erroe

private int height(Node<T> node){ 

     if(!isEmpty() && node != null){ 
      if(isleaf(node)) 
      return 1; 
     else{ 
      int p = height(node.left); 
      int q = height(node.right); 
      if(p > q) 
       return p + 1; 
      else 
       return q + 1; 
     } 
    } 
    return 0; 
} 
+1

ツリーが有効ですか?また、isEmptyはどのように機能しますか?そこに再帰サイクルがあるかもしれません。また、何が起こっているかを見るためにスタックトレースを投稿することはできますか? – templatetypedef

+0

isEmpty is boolean method、戻り値root == null.Exceptionスレッド "main" java.lang.StackOverflowError \t at ATree.height(ATree.java:35)// int p = height(node.left); ATree.height(ATree.java:36)の // int q = height(node.right); – ifte

答えて

0

これは、ツリーに循環参照がある場合に発生します。ツリー構造を確認してください。デバッグ - 一意の値を割り当て、ノードを走査しながら印刷します。

+0

あなたは正しいと思います。私がそこに読もうとしているファイルには、重複した数字がたくさんあります。私のAVLは特定の入力まで動作し、それが壊れます。 AVLツリーに重複を処理する方法はありますか? – ifte

+0

ノードオブジェクトを作成して再利用しているコード部分に問題があります。各ノードに新しいインスタンスを作成する必要があります。再利用すると循環参照が作成されます。 – Gaurav