2016-04-01 49 views
0

私は何かが紛失しているはずです非常にこれは私の心を吹いているので簡単です!例外をチェックした後にプログラムが例外をスローする

私は、配列を使用して実装されたCompleteBinaryTreeを使用してヒープを実装しようとしています。このCompleteBinaryTreeはPosition<T>の配列であり、各Positionに要素が格納されています。私は、tがCompleteBinaryTreeの次の空き位置に挿入され、CompleteBinaryTreeが注文されるまでアップヒーププロセスが実行されるヒープのadd(T t)メソッドを記述しています。

private CompleteBinaryTree<T> tree = new CompleteBinaryTree<T>(); 
    private Position<T> entry = null; 

    public void add(T t) { 
     entry = tree.add(t); 

     if (entry.equals(tree.root())) { 
      return; 
     } 

     //continue to swap inserted element with its parent 
     //while it is smaller than its parent 
     while (entry.element().compareTo(tree.parent(entry).element()) < 0) { 
      Position<T> parent = tree.parent(entry); 
      Position<T> temp = entry; 
      entry = parent; 
      parent = temp; 
     } 
    } 

最初の要素はヒープに細かい追加されますが、私は2番目の要素を追加しようとすると、InvalidPositionExceptionwhile()ラインでスローされます。ここでは方法があります。これはexeptionはCompleteBinaryTreeクラスの内部からスローされている場合:

public Position<T> parent(Position<T> p) { 
     if (p == root()) throw new InvalidPositionException(); 

     return array[((ArrayPosition) p).index/2]; 
    } 

そして、ここではCompleteBinaryTreeから使用される二つの他の方法です:

public Position<T> root() { 
     if (isEmpty()) throw new InvalidPositionException(); 
     return array[1]; 
    } 

    public Position<T> add(T t) { 
     if (last == array.length) { 
      // extend array 
      ArrayPosition[] temp = (ArrayPosition[]) new Object[array.length*2]; 
      for (int i=1; i < array.length; i++) { 
       temp[i] = array[i]; 
      } 
      array = temp; 
     } 

     array[last] = new ArrayPosition(last, t); 
     return array[last++]; 
    } 
私は、 p == root()ので、スローされた例外を取得していますどのように

私はまず、pが根であるかどうかをチェックします。

EDITここ

は、ヒープtoString()によって返されCompleteBinaryTree toString()、次のとおりです。

public String toString() { 
    StringBuffer buf = new StringBuffer(); 

    for (int i = 1; i < last; i++) { 
     buf.append(" ").append(array[i]); 
    } 

    return buf.toString();  
} 
+0

'root()'がおそらく投げています。 – SLaks

+0

例外がスローされる前に、メソッドは 'entry'がルートである場合に戻りますが、' entry'がルートであるため例外がスローされますか? – KOB

+0

デバッグしましたか? 'if(p == root())'または 'if(isEmpty())'で例外が発生したので、新しいInvalidPositionException();を新しい行に移動する方が良い。 –

答えて

2

どのように私は、()のp ==ルートので、スローされた例外を取得しています私はまず、pが根であるかどうかをチェックします。

しかし、あなたはないチェックにそれがルートであるかどうかを確認するためにあらゆるtree.parent()議論を行います。そのメソッドの最初の呼び出しに渡された引数だけをチェックします。 whileループの本体が実行されるたびに、entryが新しい値に設定され、ループが繰り返されると、チェックされていない新しい値がtree.parent()に渡されます。実際には、entryの新しい値のそれぞれは、ツリー全体を子から親に、すなわちルートに向かって上に移動することになるので、前のものよりも根に近い。このプロシージャがルートに到達することがあり、ツリー内にすでに存在する要素が少なくなる可能性があります。これを解決する

一つの方法は、while状態にルートをチェック移動するために、次のようになります。その場合

while (!entry.equals(tree.root()) 
     && entry.element().compareTo(tree.parent(entry).element()) < 0) { 
    // ... 
} 

、もちろん、あなたが外で実行する現在の1回限りのチェックは必要ありません。ループ。

+0

ああ、それはすべて理にかなっており、今のようにすべてが機能しているように見えます。ありがとうございます – KOB

+0

しかし、それはヒープが注文されていないようです。ヒープに要素を追加した後、ヒープの状態を出力すると、要素が挿入されたのと同じ順序で並べられます。また、ヒープにどの要素を追加しても、各挿入後にルートの値を出力すると、挿入した最初の要素の値になります(これは、例外がスローされる前と同じように、新しく挿入された要素がルート位置にスワップされました)。追加の問題はこの問題の主題ではないことを、私は 'toString()'メソッド – KOB

+0

@ KOBを追加する私の元の投稿を参照してください、しかし、あなたの 'add()'メソッドは、どのノードにも並べ替えるものは何もしていないようです。特に、 'entry = parent'のようなコードはそうしません。' entry'が参照するノードローカル変数を変更するだけです。あなたが行くにつれ、あなたはポジションの内容を交換したいと思うかもしれませんが、それは私にとっては推測的です。 –

関連する問題