Kth Smallest Element in a BST

Problem

Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.

Note: You may assume k is always valid, 1 ≤ k ≤ BST's total elements.

Follow up: What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?

Solution

Recursive Solution

public class Solution {
    public int kthSmallest(TreeNode root, int k) {
        traversal(root, k);
        return result;
    }

    int level = 1, result = 0;

    private void traversal(TreeNode node, int k) {
        if (node == null) return;
        traversal(node.left, k);
        if (level++ == k) result = node.val;
        else traversal(node.right, k);
    }
}

Iterative Solution using Stack

public class Solution {
    public int kthSmallest(TreeNode root, int k) {
        Stack<TreeNode> s = new Stack<>();
        TreeNode node = root;
        int level = 1;
        while (!s.isEmpty() || node != null) {
            if (node != null) {
                s.push(node);
                node = node.left;
            }
            else {
                node = s.pop();
                if (level++ == k) return node.val;
                node = node.right;
            }
        }
        return 0;
    }
}

Analysis

The BST has values in order node.left -> node -> node.right
Hence it's obvious that we need to have inorder traversal
Because the most-left node is smallest, we won't update level until we reach the end of left subtree
Then we check if level reaches k, if so, return current node.val, otherwise, we turn to node.right
We increment level before we go to node.right

results matching ""

    No results matching ""