LeetCode-Tree-230-M:二叉搜索树中第K小的元素


给定一个二叉搜索树,编写一个函数 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); 
        }
    
    }

}
发布了71 篇原创文章 · 获赞 16 · 访问量 1680

猜你喜欢

转载自blog.csdn.net/Xjheroin/article/details/104068841
今日推荐