es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué no funciona mi función de creación de árbol de búsqueda binaria?

La función “create” se supone que debe preguntar al usuario cuántos nodos desea ingresar y luego insertar esa cantidad de elementos uno por uno.

Estoy utilizando la función de recorrido preorden para verificar la creación del árbol de búsqueda binario.

El código funciona bien para la parte de entrada, donde está solicitando al usuario los datos a ingresar, pero cuando se supone que muestra el árbol de manera preordenada, no hace nada y se cierra.

“`C

include <stdio.h>

include <stdlib.h>

struct Nodo
{
int dato;
struct Nodo* izquierda;
struct Nodo* derecha;
};

void insertar(struct Nodo* raiz, int x)
{
if(raiz -> izquierda == NULL && x < raiz -> dato)
{
struct Nodo* nuevoNodo = (struct Nodo* )malloc(sizeof(struct Nodo));
nuevoNodo -> dato = x;
nuevoNodo -> izquierda = NULL;
nuevoNodo -> derecha = NULL;
raiz -> izquierda = nuevoNodo;
}
else if(raiz -> derecha == NULL && x > raiz -> dato)
{
struct Nodo* nuevoNodo = (struct Nodo* )malloc(sizeof(struct Nodo));
nuevoNodo -> dato = x;
nuevoNodo -> izquierda = NULL;
nuevoNodo -> derecha = NULL;
raiz -> derecha = nuevoNodo;
}
else
{
if(x < raiz -> dato)
{
insertar(raiz -> izquierda, x);
}
else if(x > raiz -> dato)
{
insertar(raiz -> derecha, x);
}
}
}

void crear(struct Nodo* raiz)
{
raiz = (struct Nodo*)malloc(sizeof(struct Nodo));
printf("¿Cuántos nodos desea crear?: ");
int tamañoArbol;
scanf("%d", &tamañoArbol);
printf("Ingrese los datos del nodo raíz: ");
int datoEntrada;
scanf("%d", &datoEntrada);
raiz -> dato = datoEntrada;
raiz -> izquierda = NULL;
raiz -> derecha = NULL;
for(int i=1; i<tamañoarbol; i++)="" {="" printf("ingrese="" los="" datos="" del="" nodo:="" ");="" scanf("%d",="" &datoentrada);="" insertar(raiz,="" datoentrada);="" }="" }="" void="" recorridopreorden(struct="" nodo="" *raiz)="" {="" if(raiz="" !="NULL)" {="" printf("%d,="" ",="" raiz="" -=""> dato);
recorridoPreorden(raiz -> izquierda);
recorridoPreorden(raiz -> derecha);
}
}

int main()
{
struct Nodo* raiz = NULL;
crear(raiz);

<pre><code>recorridoPreorden(raiz);
return 0;
</code></pre>

}
“`</tamañoarbol;></stdlib.h></stdio.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema en el código es que la función “create” está tomando un puntero a una estructura de tipo “node”, pero no está pasando el puntero por referencia. Por lo tanto, cualquier cambio realizado al puntero dentro de la función no se refleja fuera de la función.

    Para solucionar este problema, podemos pasar un puntero a un puntero y luego desreferenciar el puntero dentro de la función para actualizar el puntero fuera de la función.

    Aquí está el código actualizado:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Node
    {
        int data;
        struct Node* left;
        struct Node* right;
    };
    
    void insert(struct Node* root, int x)
    {
        if(root -> left == NULL && x < root -> data)
        {
            struct Node* new_node = (struct Node* )malloc(sizeof(struct Node));
            new_node -> data = x;
            new_node -> left = NULL;
            new_node -> right = NULL;
            root -> left = new_node;
        }
        else if(root -> right == NULL && x > root -> data)
        {
            struct Node* new_node = (struct Node* )malloc(sizeof(struct Node));
            new_node -> data = x;
            new_node -> left = NULL;
            new_node -> right = NULL;
            root -> right = new_node;
        }
        else
        {
            if(x < root -> data)
            {
                insert(root -> left, x);
            }
            else if(x > root -> data)
            {
                insert(root -> right, x);
            }
        }
    }
    
    void create(struct Node** root_ptr)
    {
        *root_ptr = (struct Node*)malloc(sizeof(struct Node));
        printf("\n¿Cuántos nodos quieres crear?: ");
        int tree_size;
        scanf("%d", &tree_size);
        printf("\nIngresa los datos para el nodo raíz: ");
        int ent_data;
        scanf("%d", &ent_data);
        (*root_ptr) -> data = ent_data;
        (*root_ptr) -> left = NULL;
        (*root_ptr) -> right = NULL;
        for(int i=1; i<tree_size; i++)="" {="" printf("\ningresa="" los="" datos="" para="" el="" nodo:="" ");="" scanf("%d",="" &ent_data);="" insert(*root_ptr,="" ent_data);="" }="" }="" void="" preordertraversal(struct="" node="" *root)="" {="" if(root="" !="NULL)" {="" printf("%d,="" ",="" root="" -=""> data);
            preOrderTraversal(root -> left);
            preOrderTraversal(root -> right);    
        }
    }
    
    
    int main()
    {
        struct Node* root = NULL;
        create(&root);
    
        preOrderTraversal(root);
        return 0;
    }
    

    En este código actualizado, la función “create” está tomando un puntero a un puntero (struct Node** root_ptr). Dentro de la función, usamos root_ptr para desreferenciar el puntero y asignarle un nuevo valor (malloc a un nuevo Node). Luego usamos (root_ptr) para acceder a la estructura Node y actualizar sus campos data, left y right.

    La función “insert” y la función “preOrderTraversal” permanecen sin cambios.

    Cuando llamamos a la función “create” en la función “main”, pasamos un puntero a la estructura Node raíz usando el operador & (dirección de). Esto nos permite actualizar la estructura Node raíz dentro de la función “create” y reflejar esos cambios fuera de la función.

    Con estos cambios, el código ahora debería crear correctamente un árbol de búsqueda binaria e imprimirlo en el orden de recorrido preordenado.</tree_size;></stdlib.h></stdio.h>

Comments are closed.