230.二叉搜索树(BST)中第 K 小的元素
题目
LeetCode 中等
INFO
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例:
输入:root = [3,1,4,null,2], k = 1
输出:1
输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3
题解
使用中序遍历
方法:递归
递归
O(N) O(N)
ts
function kthSmallest(root: TreeNode | null, k: number): number {
let res = null
let inOrderTraverseNode = function (node: TreeNode) {
if (node !== null && k > 0) {
console.log('node', node.val, 'k', k)
inOrderTraverseNode(node.left)
console.log('---- node', node.val, 'k', k)
if (--k === 0) {
res = node.val
return
}
inOrderTraverseNode(node.right)
}
}
inOrderTraverseNode(root)
return res
}
const tree = new Tree([5, 3, 6, 2, 4, null, null, 1]),
k = 6
console.log('🌰', kthSmallest(tree.root, k))
方法:迭代
迭代
O(H + k) O(H)
ts
function kthSmallest2(root: TreeNode | null, k: number): number {
const stack = []
while (root != null || stack.length) {
console.log('-------------')
console.log('root', root?.val, 'k', k)
console.log(stack.map(i => i.val))
while (root != null) {
stack.push(root)
root = root.left
console.log(stack.map(i => 'left ' + i.val))
}
root = stack.pop()
--k
if (k === 0) {
break
}
console.log('root pop', root.val)
root = root.right
}
return +root.val
}
console.log('🌰', kthSmallest2(tree.root, k))