सी

2010-03-24 5 views
5

में बाइनरी सर्च ट्री मैं पाइथन लड़का हूं। सी भाषा सीखना और मैं सी में बाइनरी सर्च ट्री को कार्यान्वित करने की कोशिश कर रहा हूं। मैंने कोड लिखा है, और मैं कुछ घंटों से कोशिश कर रहा हूं, लेकिन उम्मीद के अनुसार आउटपुट प्राप्त करने में सक्षम नहीं हूं। कृपया सहायता कीजिए!सी

कृपया मुझे सही करें।

#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); 
} 
+0

वास्तव में "के रूप में उम्मीद उत्पादन प्राप्त करने में सक्षम नहीं" का मतलब क्या है? – Naveen

+0

अपना कोड डीबग करें और अपनी सटीक समस्या पाएं। – medopal

+0

@Naveen I get | 5 | 32 | 42 जब प्रदर्शन ट्री() फ़ंक्शन कॉल करते हैं। मैं उम्मीद करता हूं कि यह शेष तत्वों को भी मुद्रित करे। – heapzero

उत्तर

5

समस्या सम्मिलन में है। यदि nodeNULL है तो आप एक नया नोड बनाते हैं और इसे वापस कर देते हैं। लेकिन क्या होगा यदि नोड 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. 
} 
+0

वाह! यह काम करता हैं..! बहुत बहुत धन्यवाद कोड! लेकिन, यह पता लगाने में सक्षम नहीं है कि यह वास्तव में कैसे काम करता है। यह वापसी मूल्य 'नोड' कहां जाता है? क्षमा करें, बेवकूफ सवाल के बारे में :) – heapzero

+0

@heapzero: वापसी मूल्य माता-पिता को एक बच्चे नोड के रूप में सेट किया जाता है। यदि आप कुछ भी वापस नहीं कर रहे हैं, तो यह अंतिम निर्मित नोड पिकअप कर सकता है और इसे माता-पिता के बच्चे के रूप में जोड़ सकता है। इस वजह से, आपके नव निर्मित नोड्स केवल रूट नोड के बच्चे के रूप में जोड़े जा रहे हैं। – Naveen

+0

धन्यवाद @ नवीन! यह अब समझ में आता है! – heapzero

2

आपका insertElement हमेशा कोई मान नहीं देता है। यही कारण है कि आपकी रिकर्सिव कॉल गलत हो जाती है। अपने कंपाइलर को इस तरह की गलतियों के बारे में चेतावनी देने के लिए कहें (उदा।, जीसीसी पर, -Wall का उपयोग करें)।

displayTree में एक ही त्रुटि है, TreeNode* वापस करने के लिए निर्दिष्ट होने पर कुछ भी नहीं लौटा रहा है।

main भी एक मूल्य वापस करना चाहिए (या आपको इसे void घोषित करना चाहिए)।

+1

अफैइक ने 'शून्य' वापस लौटने के रूप में 'मुख्य 'घोषित किया है, सी 99 के बाद से हटा दिया गया है। –

+0

@ थॉमस धन्यवाद! कोडडिक्ट द्वारा सुझाए गए कोड के अनुसार, अब 'insertElement() 'फ़ंक्शन एक मान देता है। यह काम करता हैं! – heapzero

+0

@ फ़ेलिक्स: यह वास्तव में बहिष्कृत नहीं है: सी 99 कार्यान्वयन-परिभाषित प्रविष्टि बिंदु के लिए अनुमति देता है, और 'मुख्य() 'के रिटर्न प्रकार के बारे में कुछ कहना है:" यदि वापसी प्रकार int के साथ संगत नहीं है, तो समाप्ति की स्थिति मेजबान पर्यावरण में लौटाया गया निर्दिष्ट नहीं है "; पोर्टेबिलिटी कारणों के लिए, आपको जितना संभव हो सके कार्यान्वयन-परिभाषित और अनिर्दिष्ट व्यवहार से बचना चाहिए, यानी 'int main (शून्य)' और 'int main (int argc, char * argv []) ' – Christoph