Binäre Suche Baum in C

stimmen
5

Ich bin ein Python-Typ. C Sprache zu lernen, und ich habe versucht, binären Suchbaum in C zu implementieren ich den Code notiert hat, und ich habe von einigen Stunden versucht, aber nicht in der Lage, die Ausgabe zu erhalten, wie erwartet. Bitte um Hilfe!

Bitte korrigieren Sie mich.

#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);
}
Veröffentlicht am 24/03/2010 um 11:42
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
2

Ihr insertElementnicht immer einen Wert zurück. Deshalb ist Ihre rekursive Aufrufe schief gehen. Lassen Sie Ihre Compiler Sie über Fehler, so zu warnen (zB auf gcc verwenden -Wall).

displayTree, hat einen ähnlichen Fehler nichts zurückkehrt , wenn es angegeben ist ein zurückzukehren TreeNode*.

mainsollte auch einen Wert (oder sollten Sie es erklären zurückkehren void).

Beantwortet am 24/03/2010 um 11:49
quelle vom benutzer

stimmen
5

Das Problem ist in der Einführrichtung. Wenn nodeist NULLerstellen Sie einen neuen Knoten und gibt es zurück. Aber was , wenn der Knoten nicht NULL. Sie machen richtig Änderungen an den rechten / linken Unterbaum , aber sie sind wieder nichts.

Veränderung

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

zu:

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.
}
Beantwortet am 24/03/2010 um 11:53
quelle vom benutzer

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