obtenir une erreur de segmentation dans la recherche d'un élément dans l'arbre de recherche binaire en c ++

voix
1
node ** BST :: searchElement(node **tree, int item)
{
    if( ((*tree)->data == item) || ( (*tree) == NULL) )
        return tree;
    else if( item < (*tree)->data)
        return searchElement( &(*tree)->left, item);
    else
       return searchElement( &(*tree)->right, item);
}

int main(){
    BST obj;
    int choice;
    int height=0,total=0,n,item;
    node **tmp;
    system(cls);

    while(1){
        //clrscr();
        cout<<*****BINARY SEARCH TREE OPERATIONS*****\n\n;
        cout<<1) Create Tree\n;
        cout<<2) Traversal\n;
        cout<<3)  Insert Node\n;
        cout<<4)  Search Node\n;
        cout<<5 Find Smallest Node\n;
        cout<<6) Find Largest Node\n;
        cout<<7) Exit\n;
        cout<<Enter your choice : ;
        cin>>choice;
        switch(choice){
            case 1 : //Create Tree
                cout<<\n\n--Creating Tree--;
                cout<<\nHow many nodes u want to enter : ;
                cin>>n;
                for(int i=0;i<n;i++){
                    cout<<Enter value : ;
                    cin>>item;
                    obj.createTree(&obj.tree,item);
                }
                break;

            case 2 : //All Traversals
                cout<<\n\nInorder Traversal : ;
                obj.inOrder(obj.tree);

                cout<<\n\nPre-order Traversal : ;
                obj.preOrder(obj.tree);

                cout<<\n\nPost-order Traversal : ;
                obj.postOrder(obj.tree);
                getch();
                break;

            case 3 : //Inserting a node in a tree
                cout<<\n\n--Inserting Node in a tree--\n;
                cout<<Enter value : ;
                cin>>item;
                obj.createTree(&obj.tree,item);
                cout<<\nItem is inserted\n;
                getch();
                break;

            case 4 : //Search element
                cout<<\n\n--Search Element--\n;
                cout<<Enter item to searched : ;
                cin>>item;
                &(*tmp) = obj.searchElement(&obj.tree,item);
                if( (*tmp) == NULL)
                cout<<\nSearch Element was not Found;
                else
                    cout<<\nSearch Element was Found;
                getch();
                break;
            case 5 : //Find Smallest Node
                cout<<\n\nSmallest Node is :  ;
                obj.findSmallestNode(obj.tree);
                getch();
                break;

            case 6 : //Find Largest Node
                cout<<\n\nLargest Node is :  ;
                obj.findLargestNode(obj.tree);
                getch();
                break;



            case 7: exit(1);
        }//end of switch
    }
}

Dans le programme ci-dessus, seul cas 4 ne fonctionne pas correctement lorsque je tente de trouver l'élément particulier dans l'arbre. J'ai inclus la fonction de membre de l'élément de recherche sur le haut du programme principal. Lorsque je programme de mise au point, je recevais une erreur de segmentation en fonction membre d'élément de recherche en particulier si la condition. Je ne sais vraiment pas ce que je dois faire pour sortir de ce problème. Quelqu'un peut-il s'il vous plaît aidez-moi à savoir pourquoi une erreur de segmentation se passe à l'intérieur de l'élément fonction de recherche membre. Laissez-moi savoir si vous avez des questions concernant ce programme.

Créé 15/04/2011 à 17:23
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
3
if( ((*tree)->data == item) || ( (*tree) == NULL) )

Devrait être

if ( ( (*tree) == NULL) || ((*tree)->data == item) )

Si *treeeffectivement est nul vous déréférencement d' un pointeur NULL dans la première vérification. Permutation entre eux autour de veiller à ce que *treen'est pas NULL lorsque vous vérifiez (*tree)->data- en raison de l' évaluation de court - circuit

De plus, &(*tmp)devrait être écrit seulementtmp

Créé 15/04/2011 à 17:28
source utilisateur

voix
0

Vous déréférencement d'un pointeur initialisés (tmp). Vous devez allouer de la mémoire soit pour elle ou tout simplement l'ignorer est l'utilisation (je ne peux vraiment pas comprendre pourquoi vous avez besoin d'un NODE ** temporaire ici.)

Créé 15/04/2011 à 17:28
source utilisateur

voix
0

Voici les critiques de couple:
Puisque vous ne cherchez un nœud, vous n'avez pas besoin des pointeurs à des pointeurs. La seule fois où vous avez besoin pointeurs de pointeurs sont lorsque vous avez réellement besoin de modifier le paramètre. En outre, puisque vous utilisez C ++, au lieu de passer un pp, vous devez passer une référence: noeud * et arbre. Cela le rend si vous pouvez travailler avec la variable d'arbre sans avoir à déréférencer, car le compilateur se chargera de cela pour vous.

Dans vos déclarations si, vous ne vérifiez pas si vos pointeurs gauche ou à droite sont des pointeurs nuls. Je ne sais pas si vous avez des nœuds sentinelles pour cela, mais je suppose que vous ne le faites pas. Avec cela, je voudrais changer votre méthode pour cela:

node * BST :: searchElement(node *tree, int item)
{
    if(tree->data == item)
        return tree;
    //short circuit if statements
    else if( (tree->left != NULL) && (item < tree->data) )
        return searchElement( tree->left, item );
    else if( (tree->right != NULL) && (item > tree->data) ) //>= for duplicates
        return searchElement( tree->right, item );

    return NULL; //if it isn't found
}
Créé 15/04/2011 à 17:40
source utilisateur

voix
0

Oui. En effet, comme Erik déjà posté, vous devez écrire

if ( ( (*tree) == NULL) || ((*tree)->data == item) )

au lieu de

if( ((*tree)->data == item) || ( (*tree) == NULL) )

Car si itemn'est pas déjà dans un arbre de votre code conduira certainement à segfault lorsque vous essayez de pointeur NULL déréférencer.

Il y a aussi un autre problème (pas évident) - absolument récursivité inutile. Si vous ne faites pas l' équilibrage prudent lorsque vous insérer ou de retirer des nœuds d'arbres que vous aurez au plus la hauteur des arbres linéaire et donc au plus récursion linéaire qui peut facilement conduire à débordement de la pile. Donc , vous devez transformer searchElementfonction

node** BST::searchElement( node** tree, int item )
{
    while(  ( (*tree) != NULL)  &&  ( (*tree)->data != item )  )
    {
        if( item < (*tree)->data )
        {
            tree = &(*tree)->left;
        }
        else
        {
            tree = &(*tree)->right;
        }
    }

    return tree;
}
Créé 15/04/2011 à 20:37
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more