📅  最后修改于: 2023-12-03 14:58:31.894000             🧑  作者: Mango
本题为GATE-CS-2017(套装1)的第38题,涉及程序设计与数据结构。
给定一个二叉搜索树(BST)的根节点和一个整数k,编写一个函数来查找BST中最小的k-元素。例如,在给定下面的BST中,最小的3元素是4、6和7。
5
/ \
3 6
/ \
2 4
7
一种常见的方法是使用中序遍历,将bst转换为升序数组,然后返回数组的前k个元素。
另一种方法是使用堆进行查找。我们可以先建立一个最大堆(根节点最大),在遍历树时,对于每个节点,如果堆大小为k,我们将当前节点的值与最小元素(根)进行比较。如果小于根,则用当前节点替换堆的根,否则,我们不需要做任何操作。
以下是使用堆的代码示例,使用了python语言。
import heapq
def kSmallest(root, k):
"""
:type root: TreeNode
:type k: int
:rtype: List[int]
"""
heap = []
def traverse(node):
if not node:
return
heapq.heappush(heap, -node.val)
if len(heap) > k:
heapq.heappop(heap)
traverse(node.left)
traverse(node.right)
traverse(root)
return [-x for x in heap]
以上代码通过递归遍历BST,在堆中维护最小的k个元素。使用了heapq库,利用heap数据结构的性质,时间复杂度为O(n log k)。