From d3bc1dee6b7816550827b217ed23438bde75db86 Mon Sep 17 00:00:00 2001 From: Kapy Kangombe Date: Sun, 22 Mar 2026 19:42:27 -0700 Subject: [PATCH] Replace O(n) time/space inorder vector approach with O(k + h) time, O(h) space recursive solution that short-circuits once the kth smallest is found --- .../kth_smallest_number_in_BST_recursive.cpp | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/cpp/Trees/kth_smallest_number_in_BST_recursive.cpp b/cpp/Trees/kth_smallest_number_in_BST_recursive.cpp index 2398b3e..8fd75d6 100644 --- a/cpp/Trees/kth_smallest_number_in_BST_recursive.cpp +++ b/cpp/Trees/kth_smallest_number_in_BST_recursive.cpp @@ -1,4 +1,3 @@ -#include #include "ds/TreeNode.h" using ds::TreeNode; @@ -12,19 +11,22 @@ using ds::TreeNode; * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ +void kthSmallest(TreeNode* node, int& k, int& smallest) { + if (!node) return; -int kthSmallestNumberInBSTRecursive(TreeNode* root, int k) { - std::vector sortedList = inorder(root); - return sortedList[k - 1]; + kthSmallest(node->left, k, smallest); + + if (k == 0) return; // short-circuit: answer found in left subtree + if (--k == 0) { + smallest = node->val; + return; + } + + kthSmallest(node->right, k, smallest); } -// Inorder traversal function to attain a sorted list of nodes from the BST. -std::vector inorder(TreeNode* node) { - if (!node) - return {}; - std::vector left = inorder(node->left); - left.push_back(node->val); - std::vector right = inorder(node->right); - left.insert(left.end(), right.begin(), right.end()); - return left; -} \ No newline at end of file +int kthSmallestNumberInBSTRecursive(TreeNode* root, int k) { + int smallest = root->val; + kthSmallest(root, k, smallest); + return smallest; +}