LeetCode230 二叉搜索树中第 K 小的元素

46 阅读1分钟

leetcode.cn/problems/kt…

image.png

解法一:中序遍历

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)
}