1、描述
给定一个二叉搜索树,编写一个函数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
2、算法
1)递归:中序遍历
思想:利用 二叉树在中序遍历后,得到的是有序数组,然后遍历到k个数即可
步骤:
1)二叉搜索树BST有一个重要性质:中序遍历为排序数组,根据这个性质,我们可将问题转化为寻找中序遍历第k个节点的值;
2)实现的方法是建立两个全局变量res和count,分别用于存储答案与计数:
在每次访问节点时,计数器-1;
当count == 0时,代表已经到达第k个节点,此时记录答案至res;
3)找到答案后,已经不用继续遍历,因此每次判断res是否为空,若不为空直接返回。
private static var res = Int.max
private static var count = 0
class func kthSmallest(_ root : TreeNode?, _ k : Int)->Int{
/*
利用 二叉树在中序遍历后,得到的是有序数组,然后遍历到k个数即可
*/
count = k
inorder(root)
return res
}
private class func inorder(_ root : TreeNode?){
if root != nil{
inorder(root?.left)
if res != Int.max {
return
}
count -= 1
if count == 0{
res = (root?.val)!
}
inorder(root?.right)
}
}
2)非递归:栈
思想:模拟系统栈的方式:使用二叉树非递归遍历的通用方法
func kthSmallest(_ root : TreeNode?, _ k : Int)->Int{
/*
模拟系统栈的方式:使用二叉树非递归遍历的通用方法
*/
var list : [TreeNode?] = [TreeNode?]()
var current = root
var k = k
var ans : TreeNode? = nil
while k > 0 {
while current != nil{
list.append(current)
current = current?.left
}
ans = list.removeLast()
current = ans?.right
k = k-1
}
return (ans?.val)!
}