这是树的第26篇算法,力扣链接。
给定一个二叉搜索树的根节点
root
,和一个整数k
,请你设计一个算法查找其中第k
个最小元素(从 1 开始计数)。示例 1:
输入:root = [3,1,4,null,2], k = 1 输出:1
首先层级遍历肯定能解题的:
func kthSmallest(root *TreeNode, k int) int {
result := -1
if root == nil {
return result
}
stack := []*TreeNode{root}
var vals []int
for len(stack) > 0 {
node := stack[len(stack)-1]
stack = stack[:len(stack)-1]
vals = append(vals, node.Val)
if node.Right != nil {
stack = append(stack, node.Right)
}
if node.Left != nil {
stack = append(stack, node.Left)
}
}
sort.Slice(vals, func(i, j int) bool {
return vals[i] < vals[j]
})
if len(vals) < k {
return vals[0]
}
return vals[k-1]
}
注意到这里时要进行排序的,我们不如直接用中序遍历,这样返回的就是有序数组。
func kthSmallest(root *TreeNode, k int) int {
var stack []*TreeNode
result := 0
node := root
for node != nil || len(stack) > 0 {
for node != nil {
stack = append(stack, node)
node = node.Left
}
node = stack[len(stack)-1]
stack = stack[:len(stack)-1]
result++
if result == k {
return node.Val
}
node = node.Right
}
return -1
}