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?
Analysis
In order traversal of BST actually returns the element in ascending order, thus intuitively, traverse the BST with in-order, and return the kth element in the result, would be the kth smallest element in a BST.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int kthSmallest(TreeNode root, int k) {
if (root == null) return 0;
List<Integer> topK = new ArrayList<Integer>();
helper(root, topK, k);
return topK.get(k - 1);
}
private void helper(TreeNode root, List<Integer> topK, int k) {
if (root == null) return;
helper(root.left, topK, k);
if (topK.size() < k) {
topK.add(root.val);
} else {
return;
}
helper(root.right, topK, k);
}
}
class Solution {
int count = 0;
int result = 0;
public int kthSmallest(TreeNode root, int k) {
count = 0;
result = 0;
dfs(root, k);
return result;
}
boolean dfs(TreeNode x, int k) {
if (x == null) return false;
if (dfs(x.left, k)) {
return true;
}
count++;
if (count == k) {
result = x.val;
return true;
}
return dfs(x.right, k);
}
}