पुनरावर्ती आदेश एक काउंटर के साथ चलो
Time Complexity: O( N ), N is the number of nodes
Space Complexity: O( 1 ), excluding the function call stack
विचार @prasadvk समाधान के समान है, लेकिन इसकी कुछ कमियां हैं (नीचे नोट्स देखें), इसलिए मैं इसे एक अलग उत्तर के रूप में पोस्ट कर रहा हूं।
// Private Helper Macro
#define testAndReturn( k, counter, result ) \
do { if( (counter == k) && (result == -1) ) { \
result = pn->key_; \
return; \
} } while( 0 )
// Private Helper Function
static void findKthSmallest(
BstNode const * pn, int const k, int & counter, int & result ) {
if( ! pn ) return;
findKthSmallest( pn->left_, k, counter, result );
testAndReturn( k, counter, result );
counter += 1;
testAndReturn( k, counter, result );
findKthSmallest( pn->right_, k, counter, result );
testAndReturn( k, counter, result );
}
// Public API function
void findKthSmallest( Bst const * pt, int const k ) {
int counter = 0;
int result = -1; // -1 := not found
findKthSmallest( pt->root_, k, counter, result );
printf("%d-th element: element = %d\n", k, result );
}
नोट्स (@ प्रसाद के समाधान से मतभेद):
if( counter == k )
परीक्षण तीन स्थानों पर आवश्यक है : (ए) बाएं उप-उपशीर्षक के बाद, (बी) रूट के बाद, और (सी) सही उपप्रति के बाद। यह सुनिश्चित करने के लिए है कि kth तत्व सभी स्थानों के लिए खोजा गया है , अर्थात चाहे वह जिस भी स्थान पर स्थित हो।
if( result == -1 )
केवल परिणाम तत्व को मुद्रित करने के लिए परीक्षण की आवश्यकता होती है , अन्यथा केथ से शुरू होने वाले सभी तत्व जड़ तक छोटे होते हैं।