Đi bộ theo thứ tự đệ quy với bộ đếm
Time Complexity: O( N ), N is the number of nodes
Space Complexity: O( 1 ), excluding the function call stack
Ý tưởng tương tự như giải pháp @prasadvk, nhưng nó có một số thiếu sót (xem ghi chú bên dưới), vì vậy tôi đăng bài này như một câu trả lời riêng biệt.
// 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 );
}
Lưu ý (và sự khác biệt so với giải pháp của @ prasadvk):
if( counter == k )
yêu cầu kiểm tra ở ba vị trí: (a) sau cây con bên trái, (b) sau gốc và (c) sau cây con bên phải. Điều này là để đảm bảo rằng phần tử thứ k được phát hiện cho tất cả các vị trí , tức là bất kể cây con mà nó nằm ở đâu.
if( result == -1 )
yêu cầu kiểm tra để đảm bảo chỉ in phần tử kết quả , nếu không tất cả các phần tử bắt đầu từ nhỏ nhất thứ k trở lên đều được in.