给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

 

示例 1:

输入:root = [3,1,4,null,2], k = 1
输出:1

示例 2:

输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3

 

 

提示:

  • 树中的节点数为 n
  • 1 <= k <= n <= 104
  • 0 <= Node.val <= 104

 

进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?

Related Topics
  • 深度优先搜索
  • 二叉搜索树
  • 二叉树

  • 👍 582
  • 👎 0
  • 【中序遍历 双解法】java中序遍历

    简单没啥好特别的,搜索树的特性,左小右大,依次遍历的话是从最小的读起的那么对应数组的第k-1位就是所求

    class Solution {
        List<Integer> list;
        public int kthSmallest(TreeNode root, int k) {
            list = new ArrayList<>();
            dfs(root);
            return list.get(k-1);
        }
    
        public void dfs(TreeNode node){
            if (node == null){
                return;
            }
            dfs(node.left);
            list.add(node.val);
            dfs(node.right);
        }
    }

    如上代码,既然我们知道了由小到大的特性,那么其实就不用遍历整个二叉树了,只要按个遍历了k个节点,将第k个节点返回即可

    class Solution {
        int num = 0;
        int k;
        public int kthSmallest(TreeNode root, int k) {
            this.k = k;
            return dfs(root);
    
        }
    
        public int dfs(TreeNode node){
            if (node == null){
                return -1;
            }
            int left = dfs(node.left);
            if (left >=0 ){
                return left;
            }
            if (++num == k){
                return node.val;
            }
            int right = dfs(node.right);
            if (right >=0 ){
                return right;
            }
            return -1;
        }
    }