In the previous post we spoke about how we can find the lowest common ancestor between two nodes. In the post we are going to tackle another LeetCode problem – finding the \(k^{th}\) smallest element in a binary search tree.
The Problem
Given the root of a binary search tree, and an integer \(k\), return the \(k^{th}\) smallest value (1-indexed) of all the values of the nodes in the tree.
Solution
To find the smallest \(k^{th}\) smallest element we need to do an in-order traversal of the tree while incrementing a counter. Once the counter is equal to \(k\) then we return the current node. Time complexity of the algorithm is \(O(h)\) and space complexity is also \(O(h)\). Here is the code:
public TreeNode<T> GetKthSmallestNode(int k)
{
var count = 0;
return FindKthSmallest(_root, k, ref count);
}
private TreeNode<T> FindKthSmallest(TreeNode<T> node, int k, ref int count)
{
if (node is null)
{
return null;
}
var left = FindKthSmallest(node.Left, k, ref count);
if (left != null)
{
return left;
}
count++;
if(count == k)
{
return node;
}
return FindKthSmallest(node.Right, k, ref count);
}
Please note that it is important to pass the count
by reference (trust me, I got burned once) since we are recursively calling FindKthSmallest
. Passing it by value throws everything under the bus since the function calls already on the call stack might be holding onto a wrong value.
This is how we find the \(k^{th}\) smallest element in a binary search tree. All the code is available on GitHub. Till next time, thanks so much for taking your time to read.
Comments