findMin怠惰な削除バイナリ検索ツリー

user11452926:

私は、バイナリ検索ツリーの怠惰な削除にfindMIn方法のため、このコードを発見しました。まず第一に、この方法は正しいのですか?それは缶の場合誰かが私にそれをしてください説明します。

private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t )
{
if (t == null) return null;

BinaryNode<E> tmp= findMin(t.left); // get minimum from the left node

if (tmp != null) return tmp; // if mimimum is not null return minimmum

if (!t.deleted) return t; // if minimum is null in left node and t is not deleted
// return t then

return findMin(t.right); // if t is deleted and minimum of left node of t is null, then search in right side

}

私は、次のものがあり、それを書き直したが、それは動作しません。

 private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t)

      {
      ArrayList<BinaryNode<AnyType>> trv = new ArrayList<BinaryNode<AnyType>>();

         return findMinVal(t, trv);
      }
private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t, ArrayList<BinaryNode<AnyType>> trv )

     {
             if(t == null) {
                 return t;
             } else {
                 BinaryNode<AnyType> left= findMin(t.left);
                 if(!t.deleted) {
                     trv.add(t);
                 }
                 BinaryNode<AnyType> right= findMin(t.right);

                 return trv.get(0);
             }
プレルナ・グプタ:

やっている間なら、これは、java.lang.IndexOutOfBoundsExceptionを投げることがtrv.get(0)ArrayListのtrvサイズは0です。

それを避けるために、あなたはの大きさがあればかどうかを確認することができますtrv0ではありません、あなたは内部でこのリストそうでない場合はnullの最初の要素を返すことができるfindMin機能

ここで更新されたコードは次のようになります。

private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t, ArrayList<BinaryNode<AnyType>> trv )

     {
             if(t == null) {
                 return t;
             } else {
                 BinaryNode<AnyType> left= findMin(t.left);
                 if(!t.deleted) {
                     trv.add(t);
                 }
                 BinaryNode<AnyType> right= findMin(t.right);

                 return trv.size()==0 ? null :trv.get(0);
             }
     }

代わりに返すの改善BinaryNode<AnyType>から、findMinとにかくあなたの結果が保存されているので、この関数は、あなたは無効返すことができtrvarrylist、代わりに毎回チェックするのreturn trv.size()==0 ? null :trv.get(0);内側findMin(これはすべての再帰呼び出しのためにチェックされます)機能、あなただけの内部ヘルパー関数一度確認することができます。

ここでは最適化されたコードを更新されます。

  private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t)

      {
      ArrayList<BinaryNode<AnyType>> trv = new ArrayList<BinaryNode<AnyType>>();

         findMinVal(t, trv);
         return trv.size()==0 ? null :trv.get(0);
      }

private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t, ArrayList<BinaryNode<AnyType>> trv )

     {
             if(t!=null) {
                 findMin(t.left);
                 if(!t.deleted) {
                     trv.add(t);
                 }
                 findMin(t.right);
             }
}

上記のorignalコード二つに条件がある場合。

if (tmp != null) return tmp;これは、我々はそうとすぐに我々はから結果を取得して、結果を保存するためのorignalコード内のデータ構造のArrayListのようなものを使用していないので、返された値を印刷するために使用されfindMin、我々はそれを返しているNULLでない再帰呼び出し。

if (!t.deleted) return t;これは次のようにそれはあなたのコードで使用されているのと同じ理由のために使用されているif(!t.deleted) {trv.add(t)}findMin(左)が返された場合、すなわち我々がチェックされnull、そのルートノードは、それがこのルートノードを右子供、したがって必要はありませんよりも小さくなるため、そのノードを返し、その後削除されていない場合さらにチェックします。

しかし、何の使用はありませんif (tmp != null) return tmp;、我々はに行くたびにとにかくので、if (!t.deleted) return t;うまく結果としてそこからは返すことができますが。だから、これはfirst if削除することができます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=283507&siteId=1