题目
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1
输出: 1
示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 3
输出: 3来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst
解题思路
因为二叉搜索树的左子树的元素全部小于根节点,右子树的元素大于根节点,因此
第一步: 先计算出左子树的个数;
第二步: 判断左子树个数left跟k的关系
1. left >= k则说明题目所求第k小的元素在左子树上,递归调用原函数
2. left+1 == k则说明所求元素为根节点元素
3. 1、2不成立则在右子树上,而所求元素变为第k-left-1小的元素。
代码如下
class Solution {
public int kthSmallest(TreeNode root, int k) {
int left = helper(root.left);
if (left >= k) {
return kthSmallest(root.left, k);
} else if (left + 1 == k) {
return root.val;
} else {
return kthSmallest(root.right, k - left-1);
}
}
public int helper(TreeNode root) {
if (root == null) {
return 0;
}
return 1 + helper(root.left) + helper(root.right);
}
}