Problem Statement
Note: Your solution should have only one BST traversal and O(1)
extra space complexity, since this is what you will be asked to accomplish in an interview.
A tree is considered a binary search tree (BST) if for each of its nodes the following is true:
The left subtree of a node contains only nodes with keys less than the node's key.
The right subtree of a node contains only nodes with keys greater than the node's key.
Both the left and the right subtrees must also be binary search trees.
Given a binary search tree t
, find the k<sup>th</sup>
smallest element in it.
Solution
Somehow it is intuitive that we should be using inorder traversal. We can keep a count variable to get the kth element while traversing the tree in inorder fashion.
Read out the comments in the below solution to understand better.
// we will call our function as KthSmallest(root, k, 0)
int KthSmallest(TreeNode root, int k, int count) {
// if not found
if(root==null)
return -1;
// Traverse the left subtree and check if kth element is found
int left = KthSmallest(root.left, k, count);
if(left!=-1)
return left;
// Increase the count, and check if the data(D) element is the ans (LDR)
count++;
if(count==k)
return root.data;
// Traverse the right subtree
return KthSmallest(root.right, k, count);
}
Time Complexity of above code will be O(n) - where n is the number of nodes in the tree, and space complexity will be O(1) as we are not using any additional space.