给定一个二叉搜索树,编写一个函数 kthSmallest
来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2 输出: 1
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1 输出: 3
进阶:
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest
函数?
思路:将BST的深度优先结果存储在List中,因为BST的深度优先遍历结果是按升序排序的,因此只需返回List中第k-1个元素即可。不过这种解决方案似乎没有用到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) {
List<Integer> res=new LinkedList<Integer>();
dfs(root,res);
return res.get(k-1);
}
public void dfs(TreeNode root, List<Integer> res){
if(null==root){
return ;
}
dfs(root.left,res);
res.add(root.val);
dfs(root.right,res);
}
}
解法二:参考LeetCode给的题解,首先遍历到根结点的最左结点,也就是BST中结点值最小的结点,在以后结束n次递归也就是遍历到第n小的结点。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private static int cnt;
private static int num;
public int kthSmallest(TreeNode root, int k) {
cnt = k;
helper(root);
return num;
}
private static void helper(TreeNode root){
if(root.left != null)
helper(root.left);
cnt--;
if(cnt == 0){
num = root.val;
return;
}
if(root.right != null)
helper(root.right);
}
}