0

バイナリツリーにノードを追加するこのメソッドがあります。この例では、最初に4を追加します。これは正しく機能し、次に10を追加すると次のようになります。 ここに画像の説明を入力してください

top != NULL4つあるため、最初にどちらが正しいかを検出し、次にtop->droiteinパラメーター(であるtop->right)を使用してメソッドを呼び出します。NULLとして検出されずtopにスキップすると、スクリーンショットに表示されるものになります。ご覧のとおり、バリバールはNULLです。

私は何が間違っているのですか?

4

1 に答える 1

3

残りのデバッグ情報を見ると、新しいノードの左右のポインターがであることがわかります0xcdcdcdcd。これは、私が知る限り、VisualStudioでのデバッグビルドの未開始ポインターの標準値です。

エラーは、新しいノードのポインタを初期化していない。これが起こっていることです:

最初topNULL、で、が4のノードを挿入しますnbr。新しいトップはnbr4のノードですが、2つのポインタが本質的にガベージを指しています。

10を挿入しようとすると、10と4が正しく比較され、4の右側のサブツリーに10が挿入されます。この右側のサブツリーは初期化されていないため、エラーが発生します。

これを修正する1つの方法は、コードを次のようにすることです。

static void insertion(Noeud *&top, Noeud *newNoeud) {
   if (top == NULL) {
       top = newNoeud;
       top->droite = NULL;
       top->gauche = NULL;
   } else if (newNoeud->nbr < top->nbr)
       insertion(top->gauche, newNoeud);
   else
       insertion(top->droite, newNoeud);
}

完全な例を次に示します。http://ideone.com/5TDD49

于 2012-11-25T16:21:04.207 に答える