📜  门| GATE-CS-2017(套装1)|第 38 题(1)

📅  最后修改于: 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)。