2010-03-24 16 views
5

Soy un tipo de Python. Aprendiendo el lenguaje C y he estado tratando de implementar el árbol de búsqueda binaria en C. Escribí el código, y lo he intentado desde pocas horas, pero no he podido obtener el resultado esperado. ¡Por favor ayuda!Árbol de búsqueda binaria en C

Por favor, corrígeme.

#include<stdlib.h> 
#include<stdio.h> 

typedef int ElementType; 

typedef struct TreeNode { 
    ElementType element; 
    struct TreeNode *left, *right; 
} TreeNode; 

TreeNode *createTree(){ 
    //Create the root of tree 
    TreeNode *tempNode; 
    tempNode = malloc(sizeof(TreeNode)); 
    tempNode->element = 0; 
    tempNode->left = NULL; 
    tempNode->right = NULL; 
    return tempNode; 
} 

TreeNode *createNode(ElementType X){ 
    //Create a new leaf node and return the pointer 
    TreeNode *tempNode; 
    tempNode = malloc(sizeof(TreeNode)); 
    tempNode->element = X; 
    tempNode->left = NULL; 
    tempNode->right = NULL; 
    return tempNode; 
} 

TreeNode *insertElement(TreeNode *node, ElementType X){ 
    //insert element to Tree 
    if(node==NULL){ 
     return createNode(X); 
    } 
    else{ 
     if(X < node->element){ 
      node->left = insertElement(node->left, X); 
     } 
     else if(X > node->element){ 
      node->right = insertElement(node->right, X); 
     } 
     else if(X == node->element){ 
      printf("Oops! the element is already present in the tree."); 
     } 
    } 
} 

TreeNode *displayTree(TreeNode *node){ 
    //display the full tree 
    if(node==NULL){ 
     return; 
    } 
    displayTree(node->left); 
    printf("| %d ", node->element); 
    displayTree(node->right); 
} 

main(){ 
    //pointer to root of tree #2 
    TreeNode *TreePtr; 
    TreeNode *TreeRoot; 
    TreeNode *TreeChild; 

    //Create the root of tree 
    TreePtr = createTree(); 

    TreeRoot = TreePtr; 

    TreeRoot->element = 32; 
    printf("%d\n",TreeRoot->element); 

    insertElement(TreeRoot, 8); 
    TreeChild = TreeRoot->left; 
    printf("%d\n",TreeChild->element); 

    insertElement(TreeRoot, 2); 
    insertElement(TreeRoot, 7); 
    insertElement(TreeRoot, 42); 
    insertElement(TreeRoot, 28); 
    insertElement(TreeRoot, 1); 
    insertElement(TreeRoot, 4); 
    insertElement(TreeRoot, 5); 

// the output is not as expected :(
    displayTree(TreeRoot); 
} 
+0

lo que exactamente quiere decir con "no es capaz de obtener el resultado como se esperaba"? – Naveen

+0

Depure su código y encuentre su problema exacto. – medopal

+0

@Naveen obtengo | 5 | 32 | 42 cuando se llama a la función displayTree(). Espero que imprima los Elementos restantes también. – heapzero

Respuesta

5

El problema está en la inserción. Si node es NULL, crea un nuevo nodo y lo devuelve. Pero, ¿y si el nodo no es NULL. Está realizando cambios correctos en el subárbol derecho/izquierdo pero no está devolviendo nada.

Cambio

if(X < node->element){ 
    node->left = insertElement(node->left, X); 
} 
else if(X > node->element){ 
    node->right = insertElement(node->right, X); 
} 

a:

if(X < node->element){ 
    node->left = insertElement(node->left, X); 
    return node; // add this. 
} 
else if(X > node->element){ 
    node->right = insertElement(node->right, X); 
    return node; // add this. 
} 
+0

¡guau! funciona..! ¡Muchas gracias codaddict! Pero, al no poder averiguar, cómo funciona exactamente. ¿A dónde va este valor de retorno 'node'? lo siento, sobre la estúpida pregunta :) – heapzero

+0

@heapzero: el valor de retorno se establece como un nodo secundario para el padre. Si no devuelve nada, puede recoger el último nodo creado y anexarlo como hijo del padre. Debido a esto, sus nodos recién creados se han agregado como secundarios del nodo raíz solamente. – Naveen

+0

Gracias @Naveen! ¡Tiene sentido ahora! – heapzero

2

Su insertElement no siempre devuelve un valor. Esta es la razón por la cual sus llamadas recursivas salen mal. Dile a tu compilador que te advierta sobre errores como ese (por ejemplo, en gcc, usa -Wall).

displayTree tiene un error similar, volviendo nada cuando se especifica para devolver un TreeNode*.

main también debería devolver un valor (o lo debería declarar void).

+1

Afaik declarando que 'main' devuelve' void' está en desuso desde C99. –

+0

@Thomas ¡Gracias! según el código sugerido por codeaddict, ahora la función 'insertElement()' devuelve un valor. ¡Funciona! – heapzero

+0

@Felix: realmente no está obsoleto: C99 permite un punto de entrada definido por la implementación, y tiene lo siguiente que decir sobre el tipo de retorno de 'main()': "Si el tipo de devolución no es compatible con int, el estado de terminación devuelto al entorno del host no especificado "; por razones de portabilidad, debe evitar el comportamiento definido y no especificado de implementación tanto como sea posible, es decir, apegarse a 'int main (void)' y 'int main (int argc, char * argv [])' – Christoph

Cuestiones relacionadas