147 - 230 二叉树搜索树中第k小的元素
题目
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1 3 / 1 4 2 输出: 1
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / 3 6 / 2 4 / 1 输出: 3
进阶: 如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数?
解答
想到的方法一,是变成数组,然后用小顶堆或者快速搜索。
方法二就是中序遍历,数k个。
class Solution:
def kthSmallest(self, root: TreeNode, k: int) -> int:
stack = []
p = root
count = 0
while p is not None or stack:
while p is not None:
stack.append(p)
p = p.left
p = stack.pop()
count += 1
if count == k:
return p.val
p = p.right
Runtime: 48 ms, faster than 95.99% of Python3 online submissions for Kth Smallest Element in a BST.
Memory Usage: 16.6 MB, less than 98.18% of Python3 online submissions for Kth Smallest Element in a BST.
var kthSmallest = function(root, k) {
const stack = []
let p = root
let count = 0
while (p || stack) {
while (p) {
stack.push(p)
p = p.left
}
p = stack.pop()
count++
if (count === k) {
return p.val
}
p = p.right
}
};
Runtime: 56 ms, faster than 98.94% of JavaScript online submissions for Kth Smallest Element in a BST.
Memory Usage: 39.4 MB, less than 63.64% of JavaScript online submissions for Kth Smallest Element in a BST.
func kthSmallest(root *TreeNode, k int) int {
stack := []*TreeNode{}
count := 0
p := root
for p != nil || len(stack) != 0 {
for p != nil {
stack = append(stack, p)
p = p.Left
}
p = stack[len(stack)-1]
stack = stack[:len(stack)-1]
count++
fmt.Println("count", count)
if count == k {
return p.Val
}
p = p.Right
}
return -1
}
Runtime: 12 ms, faster than 70.69% of Go online submissions for Kth Smallest Element in a BST.
Memory Usage: 5.8 MB, less than 10.00% of Go online submissions for Kth Smallest Element in a BST.
Last updated
Was this helpful?