2010-10-14 17 views
6

पर गहराई को असाइन करना मैंने यहां कुछ अन्य लेख पढ़े जो समान दिखते थे, लेकिन मेरी समस्या का काफी जवाब नहीं दिया। मुझे प्रत्येक नोड को बाइनरी पेड़ में अपनी संबंधित गहराई को आवंटित करने के लिए एक असाइनमेंट के लिए एक प्रश्न दिया गया है। मैं बस इसे काफी नहीं मिल सकता है।प्रत्येक नोड

struct treeNode { 
    int item; 
    int depth; 
    treeNode *left; 
    treeNode *right; 
}; 
typedef treeNode *Tree; 

int assignDepth(Tree &T, int depth) 
{ 
    if(T!=NULL) 
    { 
     depth = assignDepth(T->left, depth++); 
     T->depth = depth; 
     depth = assignDepth(T->right, depth++); 
    } 
    else //leaf 
     return depth--; 
} 

मैं कागज और कलम के साथ यह माध्यम से चल रहे की कोशिश की और यह ठीक देखा, लेकिन मेरी मेज कौशल की जाँच के स्पष्ट रूप से कमी है:

संदर्भ के लिए यह मेरा कोड है।

क्या कोई मुझे सही दिशा में इंगित कर सकता है, कृपया? यह पेड़ का उपयोग करने वाला मेरा पहला समय है, और रिकर्सन मेरा मजबूत बिंदु नहीं है।

उत्तर:

void treecoords(Tree &T, int depth) 
{ 
    static int count = -1; //set to -1 so the precrement before assignment doesn't give the wrong values 
    if(T!=NULL) 
    { 
     treecoords(T->left, depth+1); //depth decrements automatically once this function call is removed from the stack 
     count++; 
     T->x = count; 
      T->y = depth; 
     treecoords(T->right, depth+1); 
    } 
} 
+1

मेरी पोस्ट का उत्तर देने वाले सभी लोगों के लिए धन्यवाद। मैं समझता हूं कि मैं इसके बारे में अब सब गलत सोच रहा था। मैं दूर जाऊंगा और जो कुछ आपने मुझे बताया है उसे दिए गए कोड को ठीक करने का प्रयास करें और मेरे अंतिम परिणाम पोस्ट करें। मैं पूरी तरह समझने के बिना किसी भी कोड का उपयोग नहीं करना चाहता (हालांकि मैं सराहना करता हूं कि आपने इसे मेरे लिए पोस्ट किया है, धन्यवाद)। – xyzjace

+0

यह काम करता है! मैंने एक रिकर्सिव एल्गोरिदम बनाया जो श्री कूपर से मेल खाता है। यह वास्तव में एक बड़े एल्गोरिदम का हिस्सा है जो पेड़ नोड्स को एक्स और वाई निर्देशांक निर्दिष्ट करता है। एल्गोरिदम अब मूल प्रश्न में है। – xyzjace

उत्तर

3

आप 'डॉन टी की जरूरत है

else //leaf 
    return depth--; 

तुम भी गहराई चर बढ़ाने के लिए नहीं करना चाहते हैं, बस + 1 अगले interation को गहराई गुजरती हैं।

इसके अलावा कोई मूल्य वापस करने की आवश्यकता नहीं है।

इस प्रयास करें:

void assignDepth(Tree T, int depth) 
{ 
    if(T!=NULL) 
    { 
     assignDepth(T->left, depth+1); 
     T->depth = depth; 
     assignDepth(T->right, depth+1); 
    } 
} 
+0

मुझे समझ में नहीं आता क्यों नहीं, लेकिन हर किसी ने इसे हटाने के लिए कहा है, इसलिए मैंने किया। रिकर्सन मेरे दिमाग को तोड़ देता है। धन्यवाद :) – xyzjace

+0

यह क्या हो रहा है के माध्यम से सोचने में मदद करता है। पहली कॉल गहराई = 0 (या जो कुछ भी) और टी पेड़ की जड़ है। मान लीजिए कि टी पूर्ण नहीं है, फ़ंक्शन गहराई से +1 के साथ बाएं उप-पेड़ पर कॉल करता है, वर्तमान (रूट) नोड को गहराई से निर्दिष्ट करता है, फिर गहराई + 1 के साथ फिर से दाएं उप-पेड़ पर कॉल करता है। यह वह मध्य चरण है जो नोड को गहराई पैरामीटर का मान निर्दिष्ट करता है, इसलिए मूल्य को कहीं भी वापस करने की आवश्यकता नहीं है। –

+0

यह समझ में आता है। मुझे रिकर्सन में लौटने वाले मूल्य के साथ थोड़ा उलझन मिलता है। लेकिन मुझे लगता है कि अब मैं इसे प्राप्त करता हूं। बहुत सराहना की :) – xyzjace

2

ठीक है, शुरुआत के लिए, आप के बाद वेतन वृद्धि/कमी का उपयोग कर रहे, तो आप शायद मतलब सही काम के लिए ++depth/--depth और बाकी वापसी;

इसके अलावा, संदर्भ सूचक के रूप में पॉइंटर क्यों पास करते हैं?

+0

मैंने आपके द्वारा सुझाए गए पूर्वाग्रह की कोशिश की और यह वहां जा रहा है, लेकिन बिल्कुल सही नहीं है। मैं पोस्ट के बजाय प्रीक्रिकमेंट का उपयोग क्यों करूं? मैंने सोचा कि केवल संचालन के क्रम में mattered? मैं एक सूचक के संदर्भ का उपयोग कर रहा हूं क्योंकि ऐसा लगता है कि यह काम करता है।हमें पॉइंटर्स को बहुत संक्षिप्त परिचय दिया गया था, फिर पेड़ के सागर में गिरा दिया गया था। यह बहुत अनुमान था और यह देखने के लिए जांचें कि संकलक ने मुझ पर त्रुटियों को फेंकना बंद कर दिया था। – xyzjace

1
int assignDepth(Tree &T, int depth) 

आप एक treeNode के सूचक के रूप Tree को परिभाषित किया है। आपको संदर्भ द्वारा इसे पास करने की आवश्यकता नहीं है। आप जिस नोड को इंगित करते हैं उस नोड को संशोधित कर सकते हैं।

{ 
    if(T!=NULL) 
    { 
     depth = assignDepth(T->left, depth++); 

पोस्टफ़िक्स ++ सुनिश्चित करता है कि आप मूल depth नीचे गुजर रहे हैं। यह वही नहीं है जो आप चाहते हैं। इससे पहले depth बढ़ाएं, और फ़ंक्शन परिणाम के रूप में इसे वापस करने के बारे में भूल जाएं।

T->depth = depth; 

यह ठीक है।

 depth = assignDepth(T->right, depth++); 

पिछले पुनरावर्ती कॉल के लिए के रूप में समान है, सिवाय इसके कि यहाँ आप बिल्कुल depth संशोधित नहीं करना चाहिए, क्योंकि यह पहले से ही वृद्धि की गई है।

} 
    else //leaf 
     return depth--; 

आप किसी भी गहराई से जानकारी वापस जाने के लिए की आवश्यकता नहीं है (या एक अनकहा आवश्यकता है कि है?)।

} 

चीयर्स & hth।,

+0

मैंने यह सुनिश्चित करने के लिए सभी टिप्पणियां पढ़ीं कि मुझे कुछ भी याद नहीं है। धन्यवाद :) – xyzjace

1
  1. एक बार जब आप एक पत्ता नोड पहुँच गए हैं, तो आप, इसकी गहराई किसी भी अधिक की परवाह नहीं तो वापसी मान कुछ भी नहीं पूरा करने के लिए प्रकट होता है है।

  2. दो कथनों में:

    depth = assignDepth(T->left, depth++); 
    // and 
    depth = assignDepth(T->right, depth++); 
    

आप एक बीच के अनुक्रम बिंदु के बिना depth को संशोधित करने में दो बार (हालांकि ऐसा लगता है जैसे होना चाहिए से अपरिभाषित व्यवहार है, वहाँ है नहीं के बीच एक दृश्य बिंदु असाइनमेंट के दाएं और बाएं किनारे)।

+0

मुझे अभी एहसास हुआ कि रिटर्न वैल्यू अनावश्यक क्यों है क्योंकि मैं इसे टाइप कर रहा था। मैं बेवकूफ महसूस करता हूँ। धन्यवाद :)! सुनिश्चित नहीं है कि अनुक्रम बिंदु क्या हैं, क्षमा करें। – xyzjace

+0

@ user475234: मैंने इसे भी उल्लेख करने पर बहस की, क्योंकि कोड को ठीक करने से अन्यथा इस समस्या को भी हटा दिया जाएगा। कुछ अपवाद के साथ, सी मूल रूप से कहता है कि आप किसी दिए गए कथन में केवल एक विशेष चर को संशोधित कर सकते हैं, और इस मामले में आप इसे दो बार कर रहे हैं (एक बार वृद्धि में, एक बार असाइनमेंट में)। –

1
  1. नोड न्यूल होने पर आप वापस क्यों आ रहे हैं। आपके विनिर्देश के अनुसार आपको किसी भी गहराई को वापस करने की आवश्यकता नहीं है
  2. अन्य मामले में आपको केवल गहराई में वृद्धि करने और फ़ंक्शन कॉल पर भेजने की आवश्यकता है। निम्नलिखित कोड के अपने संस्करण है

    शून्य assignDepth (ट्री & टी, पूर्णांक गहराई) { यदि (टी == शून्य) वापसी; अन्य { टी-> गहराई = गहराई; अगर (टी-> बाएं! = एनयूएलएल) असाइन डीपथ (टी-> बाएं, गहराई + 1); अगर (टी-> दाएं! = एनयूएलएल) असाइन डेपथ (टी-> दाएं, गहराई + 1); } }

+0

यह थोड़ा और समझने शुरू कर रहा है। मुझे अब एहसास है कि जब रिकर्सन समाप्त हो जाता है तो उसे गहराई को वापस करने की आवश्यकता नहीं होती है, क्योंकि यह फ़ंक्शन को स्टैक से खींचता है, गहराई वही मान होती है जो आपको फ़ंक्शन कहने से पहले होती थी। धन्यवाद: डी! – xyzjace

1

मैं नोड प्रकार अलग-अलग लिए थोड़ी ज्यादा जटिल डिजाइन है और ऐसा किया, तो मैं आईडी शेयर सोचा।

यदि आपके पास एक पेड़ है जो नोड से नोड (बाइनरी, यूनरी इत्यादि) में भिन्न होता है तो नोड्स प्रकार की जांच करने के लिए गंदा एम्बेडेड आईएफ से बचने के लिए पारंपरिक विधि को सरल बनाना उचित है।

दो कार्य:

  • 1: जड़ से, प्रत्येक नोड के माध्यम से चलाने के लिए और recursivly ही बुला और हर माता-पिता के लिए 1 जोड़कर जड़ तक इसकी दूरी की जाँच करें। प्रत्येक नोड को स्टोर करने के लिए एक गहराई चर दें।
  • 2: पेड़ में नोड्स के पूर्ण सेट से प्रत्येक नोड गहराई के विरुद्ध MAX चेक चलाएं, उच्चतम संख्या पेड़ के की गहराई के बराबर होगी।

इस तरह से प्रसंस्करण स्पष्ट प्रकार की जांच को हटा देता है और नोड की गणना करता है चाहे उसके पास एक, दो या सौ बच्चे हों।

आशा इस कोई मदद करता है!

संबंधित मुद्दे