conseguir fallo de segmentación en la búsqueda de un elemento de árbol binario de búsqueda en C ++

votos
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
    }
}

En el programa anterior, único caso 4 no funciona correctamente cuando trato de encontrar el elemento en particular en el árbol. He incluido la función de miembro de elemento de búsqueda en la parte superior del programa principal. Cuando estaba depuración de programas, que estaba recibiendo fallo de segmentación en función miembro elemento de búsqueda sobre todo en caso de condiciones. Realmente no sé lo que tengo que hacer para salir de este problema. Puede alguien por favor me ayude a averiguar por qué fallo de segmentación está sucediendo dentro de la función de búsqueda de miembros elemento. Déjeme saber si usted tiene alguna pregunta acerca de este programa.

Publicado el 15/04/2011 a las 17:23
fuente por usuario
En otros idiomas...                            


4 respuestas

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

Debiera ser

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

Si *treerealmente es nula que estés eliminación de referencias a un puntero nulo en el primer cheque. Intercambio de ellos alrededor se asegurará de que *treeno es NULL cuando se echa (*tree)->data- debido a la evaluación de cortocircuito

Además, &(*tmp)debe ser escrito como se acabatmp

Respondida el 15/04/2011 a las 17:28
fuente por usuario

votos
0

Estás eliminación de referencias a un puntero no inicializado (TMP). Usted debe asignar memoria, ya sea a favor o en la omitida es el uso (que realmente no puedo entender por qué necesita un nodo temporal ** aquí.)

Respondida el 15/04/2011 a las 17:28
fuente por usuario

votos
0

Aquí hay un par de críticas:
Dado que sólo está en busca de un nodo, no es necesario punteros a punteros. La única vez que necesite punteros a punteros son cuando realmente se necesita modificar el parámetro. Además, dado que está utilizando C ++, en lugar de pasar un PP, debe pasar una referencia: * nodo y árbol. Esto hace que sea para que pueda trabajar con la variable de árbol sin tener que eliminar la referencia, ya que el compilador se encargará de que para usted.

En sus instrucciones if, no mirando si sus punteros izquierdos o derechos son punteros nulos. No estoy seguro de si tiene ganglios centinela para esto, pero estoy suponiendo que no lo hace. Con eso, me gustaría cambiar su método para esto:

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
}
Respondida el 15/04/2011 a las 17:40
fuente por usuario

votos
0

Sí. De hecho, como ya se ha escrito Erik tiene que escribir

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

en lugar de

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

Porque si itemno está ya en un árbol de su código sin duda dará lugar a segfault cuando se trata de eliminar la referencia de puntero NULL.

También hay otro (no es tan obvio) problema - absolutamente recursividad innecesaria. Si usted no está haciendo un cuidadoso equilibrio cuando inserción o eliminar nodos del árbol que tendrá como máximo la altura del árbol lineal y por lo tanto, como máximo nivel de recursividad lineal que puede conducir fácilmente a desbordamiento de pila. Por lo que debe transformar searchElementla función de

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;
}
Respondida el 15/04/2011 a las 20:37
fuente por usuario

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