Binary Recherche Arbre en C

voix
5

Je suis un gars de Python. Apprendre le langage C et j'ai essayé de mettre en œuvre Binary Search Arbre en C. Je notais le code, et je l'ai essayé de quelques heures, mais, pas en mesure d'obtenir la sortie comme prévu. S'il vous plaît aider!

S'il vous plaît corrigez-moi.

#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);
}
Créé 24/03/2010 à 11:42
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Votre insertElementne renvoie pas toujours une valeur. Ceci est la raison pour laquelle vos appels récursifs vont mal. Dites à votre compilateur pour vous avertir des erreurs comme ça (par exemple, sur gcc, utilisez -Wall).

displayTreea une erreur semblable, rien de revenir quand il est spécifié pour renvoyer un TreeNode*.

maindevrait aussi retourner une valeur (ou vous devez le déclarer void).

Créé 24/03/2010 à 11:49
source utilisateur

voix
5

Le problème est dans l'insertion. Si nodeest NULLvous créez un nouveau nœud et le retourner. Mais si le nœud est pas NULL. Vous apportez des modifications à corriger la sous - arborescence droite / gauche , mais vous n'êtes pas tout retournerez.

Changement

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

à:

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.
}
Créé 24/03/2010 à 11:53
source utilisateur

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