230. 二叉搜索树中第K小的元素 中等

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

示例 1:

输入:root = [3,1,4,null,2], k = 1
输出:1

示例 2:

输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3

提示:

  • 树中的节点数为 n 。
  • 1 <= k <= n <= 104
  • 0 <= Node.val <= 104

代码参考:

package main

import "fmt"

func main() {
    root := &TreeNode{Val: 3}
    root.Left = &TreeNode{Val: 1}
    root.Left.Right = &TreeNode{Val: 2}
    root.Right = &TreeNode{Val: 4}

    //   3
    //  / \
    // 1   4
    //  \
    //   2
    fmt.Println(kthSmallest(root, 1)) // 1
}

// 显然是中序遍历的 stack 迭代遍历,计数取值
func kthSmallest(root *TreeNode, k int) int {
    if k == 0 || root == nil {
        return -1
    }

    var counter int
    var stack []*TreeNode
    cur := root
    for len(stack) > 0 || cur != nil {
        if cur != nil {
            stack = append(stack, cur)
            cur = cur.Left
            continue
        }

        // 现在左子节点为空 // bingo
        parent := stack[len(stack)-1]
        stack = stack[:len(stack)-1] // pop
        counter++
        if counter == k {
            return parent.Val
        }
        cur = parent.Right
    }
    return -1
}
最后编辑: kuteng  文档更新时间: 2021-06-05 10:16   作者:kuteng