Kth Largest Element in a Stream
We have introduced the properties of a BST and how to perform the basic operations, including search, insertion and deletion, in a BST. Being familiar with these basic ideas, you will be able to apply a BST to solve a real problem.
The strength of a BST is that you can perform all search, insertion and deletion operations in O(h) time complexity even in the worst case.
Usually, if you want to store data in order and need several operations, such as search, insertion or deletion, at the same time, a BST might be a good choice.
An Example
Problem: Design a class to find the kth largest element in a stream.
A most obvious way to solve this problem is to sort the array in descending order first and then return the kth element in the array.
But we have to sort for the new element every time when we insert a new value in order to perform the search operation in O(1) time complexity. But the time complexity of the insertion operation will be O(N) in average. Therefore, time complexity will be O(N^2) in total.
Since we need insertion and search operations at the same time, what about using a BST to store the values?
As we know, for each node in a BST, all the values in the right subtree are larger than the value of the node itself while all the values in the left subtree are smaller than the value of the node.
In other word, for each node in a BST, if m nodes in the right subtree, the node itself is the m + 1 largest element in the existed array.
Think about the problem by yourself first. Feel free to store more than one value in a tree node. You might also want a counter in each node to indicate how many nodes there are in the subtree rooted at this node.
If you still don't have a clear clue about the solution, we provide the animation of an example for you:
1. Insertion

2. Search

BST solution:
Last updated