BST में सबसे छोटी गहराई पत्ती नोड लगता है

वोट
1

पत्ती नोड न्यूनतम गहराई है कि प्राप्त करने के लिए की जरूरत है। मैं प्रत्येक नोड में अतिरिक्त जानकारी संग्रहीत करने के लिए, कृपया सुझाव है, बहुत बहुत धन्यवाद के बिना यह करने के लिए एक अच्छा तरीका है के बारे में सोच नहीं कर सकते।

04/11/2011 को 01:03
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
2

जानवर बल समाधान पहले पत्ती पाया पर एक चौड़ाई-पहले खोज समाप्त है, इस रिकर्सिवली से iteratively लागू करने के लिए आसान हो जाएगा।

उदाहरण के लिए देखें में छद्म कोड के लिए अपने जवाब "चौड़ाई पहले बनाम गहराई पहले" बस, जबकि पाश के लिए एक और शर्त जोड़।

Btw - यह आपको मिल जाएगा एक न्यूनतम गहराई के साथ पत्ती, के रूप में वहाँ है कि गहराई में एक से अधिक हो सकता है। न्यूनतम गहराई पत्तियों का पूरा सेट हो रही है एक छोटे से कठिन है। मुझे लगता है कि एक के साथ जाने पुनरावृत्ति मजबूत बनाने की रणनीति


पता लगाना क्या स्तर है कि नोड से एक है।

तीन विकल्प:

नोड पहले और इसके लिए पेड़ के नीचे खोज का पता लगाएं। यह बेकार लगता है, लेकिन है कि दूसरी खोज के स्तर के रूप में केवल के रूप में कई नोड्स पर जाकर की आवश्यकता है, तो यह वास्तव में तेजी से होता है।

वैकल्पिक रूप से आप ट्रैक रख सकते हैं के रूप में तुम जाओ। आप तीन काउंटरों का उपयोग levelCounter, thisLevelCounterऔर nextLevelCounter। हर बार जब आप एक नया नोड आप घटती के लिए और अधिक thisLevelCounter, और जब यह शून्य हो जाती है जब आप एक स्तर नीचे स्थानांतरित कर दिया है ऐसा

levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0

हर बार जब आप खोज सूची में एक बच्चे के नोड जोड़ने के लिए, को बढ़ा देते nextLevelCounter। हर बार जब आप एक नया चाइल्ड नोड वेतन वृद्धि की दुकानnextLevelCounter

अंत में, पुनरावृत्ति मजबूत बनाने की रणनीति आप (जो यात्रा यह पाता है ...) और (हालांकि एक से थोड़ा अधिक गुणक) प्रदर्शन को उसी क्रम में चौड़ाई पहले खोज के रूप में है मुक्त करने के लिए सफलता के स्तर देता है।

04/11/2011 को 01:06
का स्रोत उपयोगकर्ता

वोट
0

यहाँ कोड संस्करण (आशा है कि मैं किसी भी त्रुटि की जांच याद नहीं किया था):

void min_leaf(node_t *t, int *min, int lev, node_t **n) {
    if (!t) {
            return;
    }   

    if (lev > *min) {
            printf("Back from %d at lev %d, min: %d already found\n",
                            t->key,
                            lev,
                            *min);
            return;
    }   

    if (!t->left && !t->right) {
            if (*min > lev) {
                    *min = lev;
                    *n = t;
            }   
    } else {
            min_leaf(t->left, min, lev+1, n); 
            min_leaf(t->right, min, lev+1, n); 
    }   
}

void bst_print_min_leaf(bst_t* bst) {
    int min = 10000; /* Replace it with some really large number */
    node_t *minn = NULL;

    min_leaf(bst->root, &min, 0, &minn); /*level: root is level 0 */
    if (minn) printf("min leaf is at depth: %d: (%p:%d)\n", min, minn, minn->key);
}
25/03/2013 को 09:31
का स्रोत उपयोगकर्ता

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