QUESTION:
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.
Example 1:
Input: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
Output: 1
Example 2:
Input: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
Output: 3
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?
EXPLANATION:
看完题目,寻找到第k小的数,那么就肯定会想到需要把二叉树摊平,那么摊平了又有好多种方法,既然是BST,那么就肯定是前序遍历才能将整个BST变成一个有序的数组或者集合。再通过这个集合查找一下就可以。同时我们又可以想,如果查找的是第一个,我们还有必要将整个树都摊平了吗,其实就是没有必要了,只要找到第k个就可以了。
思路:
- 定义两个值,一个用来表示摊平到第几个数,一个用来表示最后的结果
- 采用先序遍历的方式,遍历树
- 每次遍历到root时,就将索引进行+1
- 当索引为k的时候,表示已经遍历到了第k个小的值
- 当索引比k大时,则可以直接返回
SOLUTION:
class Solution {
public int kthSmallestResult = 0;
public int kthSmallestIndex = 0;
public int kthSmallest(TreeNode root, int k) {
if(root==null) return 0;
kthSmallest(root.left,k);
kthSmallestIndex++;
if(kthSmallestIndex == k)
kthSmallestResult = root.val;
if(kthSmallestIndex < k)
kthSmallest(root.right,k);
return kthSmallestResult;
}
}