Binar copac Căutare în C

voturi
5

Sunt un tip Python. Învățarea limbilor străine C și am încercat să pună în aplicare binar de căutare copac în C. am scris codul, și am încercat de câteva ore, dar, care nu pot obține de ieșire cum era de așteptat. Te rog ajuta-ma!

Vă rugăm să corectați-mă.

#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);
}
Întrebat 24/03/2010 la 11:42
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
2

Dvs. insertElementnu returnează întotdeauna o valoare. Acesta este motivul pentru care apelurile recursive merge prost. Spune - i compilatorului dvs. pentru a vă avertiza cu privire la greșeli de genul asta ( de exemplu, pe GCC, utilizați -Wall).

displayTreeare o eroare similară, revenind nimic atunci când este specificat să se întoarcă o TreeNode*.

mainar trebui să se întoarcă , de asemenea , o valoare (sau ar trebui să - l declare void).

Publicat 24/03/2010 la 11:49
sursa de către utilizator

voturi
5

Problema este în inserarea. Dacă nodeeste NULLsă creați un nou nod și returnați - l. Dar ce se întâmplă dacă nodul nu este NULL. Voi faceți modificări corecte la / subarborele din stânga dreapta , dar nu se întorc nimic.

Schimbare

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

la:

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.
}
Publicat 24/03/2010 la 11:53
sursa de către utilizator

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