سؤال

أنا رجل بيثون. تعلم لغة C وأنا أحاول تنفيذ شجرة البحث الثنائية في C. لقد كتبت الكود ، وكنت أحاول من ساعات قليلة ، لكنني لم أستطع الحصول على الإخراج كما هو متوقع. الرجاء المساعدة!

رجاء صحح لي.

#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);
}
هل كانت مفيدة؟

المحلول

المشكلة في الإدراج. لو 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.
}

نصائح أخرى

لك insertElement لا يعيد دائما قيمة. هذا هو السبب في أن مكالماتك العودية تخطئ. أخبر المترجم الخاص بك أن يحذرك من أخطاء من هذا القبيل (على سبيل المثال ، على دول مجلس التعاون الخليجي ، استخدم -Wall).

displayTree لديه خطأ مماثل ، لا يعود شيئًا عند تحديده لإرجاع أ TreeNode*.

main يجب أيضًا إرجاع قيمة (أو يجب أن تعلن عنها void).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top