解法一:中序遍历
BST 的中序遍历结果是有序的(升序)
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func kthSmallest(root *TreeNode, k int) int {
// 二叉搜索树的中序遍历会得到一个有序数组
list := []int{}
traverse(root, &list)
if len(list) == 0{
return 0
}
// 第k小元素
return list[k-1]
}
func traverse(root *TreeNode, list *[]int) {
if root == nil{
return
}
traverse(root.Left, list)
*list = append(*list, root.Val)
traverse(root.Right, list)
}
可以优化空间复杂度,用一个外部变量记录中序遍历结果第 k 个元素即是第 k 小的元素
解法二:辅助变量+中序遍历
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func kthSmallest(root *TreeNode, k int) int {
var res, rank int
traverse(root, &rank, &res, k)
return res
}
func traverse(root *TreeNode, rank *int, res *int, k int) {
if root == nil{
return
}
traverse(root.Left, rank, res, k)
// 中序位置
*rank++
if *rank == k{ // 找到答案
*res = root.Val
return
}
traverse(root.Right, rank, res, k)
}