私は、バイナリ検索ツリーの怠惰な削除に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です。
それを避けるために、あなたはの大きさがあればかどうかを確認することができますtrv
0ではありません、あなたは内部でこのリストそうでない場合は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
とにかくあなたの結果が保存されているので、この関数は、あなたは無効返すことができtrv
arrylist、代わりに毎回チェックするの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
削除することができます。