leetcode_272 最接近的二叉搜索树值 II

235 阅读1分钟

要求

给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的 k 个值。

注意:

给定的目标值 target 是一个浮点数
你可以默认 k 值永远是有效的,即 k ≤ 总结点数
题目保证该二叉搜索树中只会存在一种 k 个值集合最接近目标值

示例:

输入: root = [4,2,5,1,3],目标值 = 3.714286,且 k = 2

    4
   / \
  2   5
 / \
1   3

输出: [4,3]

拓展:
假设该二叉搜索树是平衡的,请问您是否能在小于 O(n)(n 为总结点数)的时间复杂度内解决该问题呢?

核心代码

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

from heapq import *
class Solution:
    def closestKValues(self, root: TreeNode, target: float, k: int) -> List[int]:
        def inorder(node):
            if not node:
                return []
            return inorder(node.left) + [node.val] + inorder(node.right)
        
        l = inorder(root)
        subs = []
        heapify(subs)
        for num in l:
            sub = abs(target - num)
            heappush(subs,(-sub,num))
            if len(subs) > k:
                heappop(subs)
        res = []
        for sub,num in subs:
            res.append(num)
        return res

image.png

解题思路:从题眼中最接近目标值 target 的 k 个值,我们通常的考虑方向就是使用堆来解决这个问题,我们使用中序遍历拿到关于有序列表,然后我们构建一个长度k的堆,然后小值入堆,大值在达到k个值后要实现出堆的操作,最终保留在对中的数据就是我们的最接近target的k个值。