LeetCode-Python-272. 最接近的二叉搜索树值 II

给定一个不为空的二叉搜索树和一个目标值 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 为总结点数)的时间复杂度内解决该问题呢?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/closest-binary-search-tree-value-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

先中序遍历得到升序数组,然后问题变成在 一个升序数组里找最接近target的k个值,

问最接近/最大/最小的k个值的问题就上堆,

这里问最接近target,就是问差值的绝对值最小,所以开一个size为k的最大堆。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
from heapq import *
class Solution(object):
    def closestKValues(self, root, target, k):
        """
        :type root: TreeNode
        :type target: float
        :type k: int
        :rtype: 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
            

 

你可能感兴趣的:(Leetcode,Python)