4

二分探索木の高さを求める関数に取り組んでいます。動作するはずの方法を見つけましたが、このエラーが発生し続け、何が問題なのかわかりません: PA5.exe の 0x00903417 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000004.

これが私の身長関数です...

template <class T>
int BST<T>::height()
{

    return displayHeight(mRootNode);    

}

template <class T>
int BST<T>::displayHeight(BST<T> *node)
{
    if (node = NULL)
    {
        return 0;
    }

    int left = displayHeight(node->mLeft);
    int right = displayHeight(node->mRight); 

    if (left > right)
        return 1 + left;
    else
        return 1 + right;
}

これはメイン関数の実装です...

 cout << endl << "height: " << tree.height();

他に何か含める必要がある場合は、お知らせください。ありがとう!

4

4 に答える 4

7
if (node = NULL)

する必要があります

if (node == NULL)

C ++では=代入演算子で==あり、比較のための関係演算子であるためです。

なぜクラッシュするのですか?

を実行するとif (node = NULL)、ノードに割り当てNULLられ、NULLである0ため、if条件は失敗します。したがって、先に進み、ノードの子で関数を再帰的に呼び出します。ここnodeで、関数が初めて呼び出されたときに実際にNULLであったとすると、NULLの左と右の子に対して再帰呼び出しを実行します!!! クラッシュにつながる。

于 2012-10-24T02:03:19.207 に答える
1

ifステートメントでノードパラメータ変数にnullを割り当てています。

if (node = NULL)
{
    return 0;
}

する必要があります

if(node == NULL) ...
于 2012-10-24T02:04:23.480 に答える
1

ツリーを作成しながら高さを見つける方法(BST):左サブツリーと右サブツリーの両方の場合::

実際のツリーを作成する前に、バイナリ ツリーに配置する要素を配列に配置します。ルートよりも大きい要素の数を計算します。これは、ツリーの左側に移動し、右側にも同様に移動します。

次に、要素をツリーに追加します。左のサブツリーに追加するか右のサブツリーに追加するかに応じて、フラグ ビットを 1 または 0 に設定します。

if(root->right && flagleft==1)
     no_left--;
     else if(root->right && flagright==1)
         no_right--;

これは、左側にノードを追加するときです。

if(root->left && flagl==1)
nl--;
else if(root->left && flagr==1)
nr--;

これは、右側にノードを追加するときです。

于 2013-04-24T05:42:53.973 に答える