পুনরাবৃত্তিমূলক ইন-অর্ডার একটি কাউন্টার সহ হাঁটুন
Time Complexity: O( N ), N is the number of nodes
Space Complexity: O( 1 ), excluding the function call stack
ধারণাটি @ প্রসাদভক সমাধানের মতো, তবে এতে কিছু ত্রুটি রয়েছে (নীচে নোট দেখুন), তাই আমি এটি আলাদা উত্তর হিসাবে পোস্ট করছি।
// 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 )
শুধুমাত্র ফলাফলের উপাদান মুদ্রিত হয়েছে তা নিশ্চিত করার জন্য পরীক্ষার প্রয়োজন , অন্যথায় কেথ থেকে শুরু করে ছোট পর্যন্ত সমস্ত উপাদান মুদ্রিত হয়।