0

これは二分探索ツリーの実装です。min メソッド (ツリー内の最小要素を見つけるため) が正しい答えを返さず、任意のメモリ アドレスを返す理由がわかりません。このコンストラクター BST(3); でツリーを作成していますが、今 min() を実行すると正しく 3 が返されますが、1(insert(1) メソッド) を挿入した後、min() は 16 進アドレスを返します。

class node{
    public:
    int key;
    node *left;
    node *right;
    node *parent;
};
class BST{
    node *root;
    public:
    BST(){}
    BST(int a){
        root=new node();
        root->left=NULL;
        root->right=NULL;
        root->parent=NULL;
        root->key=a;
    }
    void insert(int n)
    {
       if(search(n))return;
       node *p=root;
       node *m=new node;
       m->key=n;
       m->left=NULL;
       m->right=NULL;

    while(1)
    {
        if(p->key > n)
        {
            //look left
            if(p->left==NULL)
            {
                p->left=m;
                m->parent=p;
                return;
            }
            else
                p=p->left;



        }
        else
        {
            //look right
            if(p->right==NULL)
            {
                p->right=m;
                m->parent=p;
                return;
            }
            else
                p=p->right;

        }
    }
}
bool search(int n)
{
    node *p=root;
    while(1)
    {
        if(p->key > n)
        {
            //look left
            if(p->left==NULL)
                return false;

            else
                p=p->left;



        }
        else if(p->key==n)return true;
        else
        {
            //look right
            if(p->right==NULL)
                return false;

            else
                p=p->right;

        }
    }

}
int min()
{
    node *p=root;
    if(p->left == NULL)
    return (p->key);
    p=p->left;
}
};
4

2 に答える 2

2

すべての制御パスに戻らないことで未定義の動作に遭遇するため:

int min()
{
    node *p=root;
    if(p->left == NULL)
        return (p->key);
    p=p->left;
    //no return here
}

つまり、そうp->leftでない場合NULL、何かが起こる可能性があります。なんでも!

代わりにループが必要なようです。

int min()
{
    node *p=root;
    while (p->left != NULL)
        p=p->left;
    return (p->key);
}
于 2012-07-25T17:13:37.023 に答える
0

の場合p->left != NULL、何も返しません。

于 2012-07-25T17:13:51.773 に答える