给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
思路
(1)最初想的是存到链表中,比较大小来取得。
(2)发现用链表的中序遍历即可。
(3)最初k1
用的就是k,在递归中使用,发现输出一直不对。因为在递归第一层记录的k值,底层递归时虽然发生了改变,但是并没有影响上层,同时,在此处也不能结束掉整个递归,所以造成了正确的值被覆盖掉。
解法1
执行用时 :1 ms, 在所有 Java 提交中击败了83.86%的用户
内存消耗 :37.6 MB, 在所有 Java 提交中击败了41.05%的用户
class Solution {
int value = 0, k1=0;
public int kthSmallest(TreeNode root, int k) {
//inOrder + count
k1 = k;
kthSmallest2(root);
return value;
}
void kthSmallest2(TreeNode root) {
if(root == null){
return ;
}
kthSmallest2(root.left);
k1--;
if(k1 == 0){
value = root.val;
}
kthSmallest2(root.right);
}
}
解法2-优化
做了优化if(k1>0){kthSmallest2(root.right); }
,便于找到值后,跳出递归函数。
执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗 :38.2 MB, 在所有 Java 提交中击败了17.00%的用户
class Solution {
int value = 0, k1=0;
public int kthSmallest(TreeNode root, int k) {
//inOrder + count
k1 = k;
kthSmallest2(root);
return value;
}
void kthSmallest2(TreeNode root) {
if(root == null){
return ;
}
kthSmallest2(root.left);
k1--;
if(k1 == 0){
value = root.val;
}
if(k1>0){
kthSmallest2(root.right);
}
}
}