0

ヒープデータ構造を構築していますが、私を悩ませているのは、nullの子値をチェックしていることです。

ベクターを使用していて、親と子を比較していますが、子が1つしかない場合は、次のような理由でプログラムがクラッシュします。

vectorObject.get(i) //i'th element doesn't exist 

例外を返します。

次のようなnull要素を確認できません

if (vectorObject.get(i) == null)

get()メソッドを実行するとプログラムが自動的に中断されるため、読み取り不可能な奇妙なハックアラウンドなしで、存在しない要素を実際にどのようにチェックしますか?

4

2 に答える 2

1

あなたはとても混乱しているようです。ヒープデータ構造を設計するために使用している参照をすべて読み直す必要があると思います(またはウィキペディアの記事の関連セクションを読みます)。

あなたの親がにいる場合、0あなたの子供はにい2*(0)+1=1ます2*(0)+2=2。この場合、1 < vectorObject.size()はtrueになりますが、2 < vectorObject.size()falseになります。つまり、左の子はありますが、右の子はありません。

Vector(またはArrayList私の提案に従って切り替えた場合)はゼロベースなので、ではなく、かどうかを確認する必要がありi < vectorObject.size()ますi <= vectorObject.size()。その場合i < vectorObject.size()i合法的なインデックスです。

アップデート:

ここでロジックを構成する方法は2つあります。一人っ子の場合と二人っ子の場合をまったく異なる方法で処理する必要がある場合は、おそらくこれが最適に機能します。

int size = vectorObject.size();
if (2*i+2 < size) { /* Two-child case */ }
else if (2*i+1 < size) { /* One-child case */ }
else { /* No children case */ }

2つのノードを別々に処理する場合は、ネストの方が適している可能性があります。

int size = vectorObject.size();
if (2*i+1 < size) {
  // Handle left child
  if (2*i+2 < size) {
    // Handle right child
  }
  else {
    // No right child
  }
}
else { /* No children */ }
于 2012-08-20T03:59:55.120 に答える
0

try / catchを実行します:

try{

yourVector.get(int theElementYouWant);

}

catch(NullPointerException){

//well, I guess that element was null!

}
于 2013-05-06T16:29:26.880 に答える