给定一个二叉搜索树,编写一个函数 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 函数?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
———————————————————————————————————————————————————————
在bst中找到第k小的元素,要理解这句话,比如有一组数据:1,2,3,4,5,6,那么第1小的就是1,第2小的就是2.
对于bst,我们知道
1.对每一个节点,都是大于它的左子树上的所有元素,而小于右子树上的所有元素;
2.通过左-中-右的中序遍历,可以得到bst元素从小到大的顺序排列。
所以本题最好理解的解法就是采用左-中-右的中序遍历:
func kthSmallest(root *TreeNode, k int) int {
if root == nil {
return 0
}
min := root.Val
Run(root,&k,&min)
return min
}
func Run(root *TreeNode,k,min *int) {
if root == nil || *k == 0 {
return
}
Run(root.Left,k,min)
if *k == 0{
return
}
*min = root.Val
*k = *k-1
if *k == 0{
return
}
Run(root.Right,k,min)
}