Δυαδική Αναζήτηση δέντρο σε C

ψήφοι
5

Είμαι ένας τύπος Python. Εκμάθηση γλώσσας C και έχω προσπαθήσει να εφαρμόσει Binary Search Tree στο Γ έγραψα τον κωδικό, και έχω προσπαθήσει από λίγες ώρες, αλλά, δεν είναι σε θέση να πάρει το αποτέλεσμα, όπως αναμενόταν. Παρακαλώ βοηθήστε!

Παρακαλώ διορθώστε με.

#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);
}
Δημοσιεύθηκε 24/03/2010 στις 11:42
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
2

Σας insertElementδεν επιστρέφει πάντα κάποια τιμή. Αυτός είναι ο λόγος για αναδρομικές κλήσεις σας πάει στραβά. Πείτε compiler σας για να σας προειδοποιήσει για τα λάθη όπως αυτό (π.χ., σε gcc, χρήση -Wall).

displayTreeέχει ένα παρόμοιο σφάλμα, επιστρέφοντας τίποτα όταν έχει καθοριστεί να επιστρέψει ένα TreeNode*.

mainθα πρέπει επίσης να επιστρέψει μια τιμή (ή θα πρέπει να το δηλώνουν void).

Απαντήθηκε 24/03/2010 στις 11:49
πηγή χρήστη

ψήφοι
5

Το πρόβλημα είναι στην εισαγωγή. Αν nodeείναι NULLνα δημιουργήσετε ένα νέο κόμβο και να την επιστρέψει. Τι γίνεται όμως αν ο κόμβος δεν είναι NULL. Θα κάνουν σωστές αλλαγές προς τα δεξιά / αριστερά υποδέντρο αλλά δεν επιστρέφουν τίποτα.

Αλλαγή

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.
}
Απαντήθηκε 24/03/2010 στις 11:53
πηγή χρήστη

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