Kth smallest/minimum element in a BST - Rank of a BST node - Algorithms and Problem SolvingAlgorithms and Problem Solving



Kth smallest/minimum element in a BST - Rank of a BST node - Algorithms and Problem SolvingAlgorithms and Problem Solving

Given a binary search tree. Find the kth smallest element in the BST.

A quick solution would be to perform a modified inorder traversal with an extra parameter k. Each time inorder traversal is popping a node out of recursion/call stack (i.e. unwinding a recursion)then we keep decreasing the k. When k=0 then the current node in the call stack is the desired kth smallest node. This is O(n) time algorithm.

For example, for the following BST the nodes in inorder traversal are: 1, 2. 3, 4, 5, 6.  So, the 3rd smallest is 3.

                                                                             4                                   /     \                                  2       5                                 /   \       \                               1     3       6  

However with some augmented data in our tree and doing some inexpensive bookkeeping during build up of the tree, we can find kth smallest in O(lgn) time. Observe that,

Number of smaller nodes than a node is equal to the size of the left subtree.

This leads us to assign rank to each of the node. Notice that

              size(node) = size(node.left)+size(node.right)+1;                rank(node) = size(node.left)+1  

So, we can either update the size left subtree of each node during building phase of the tree or during a later phase. Now it would be easy to find kth smallest using a binary search on the tree using the fact that the kth smallest element has rank of k. If the middle element's rank is less than k then we search only in left subtree or vice versa. Below is the O(lgn) implementation of this idea with the BST augmented with size and updating the size during each insert:


Read full article from Kth smallest/minimum element in a BST - Rank of a BST node - Algorithms and Problem SolvingAlgorithms and Problem Solving


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts