要求
给定一个不为空的二叉搜索树和一个目标值 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
解题思路:从题眼中最接近目标值 target 的 k 个值,我们通常的考虑方向就是使用堆来解决这个问题,我们使用中序遍历拿到关于有序列表,然后我们构建一个长度k的堆,然后小值入堆,大值在达到k个值后要实现出堆的操作,最终保留在对中的数据就是我们的最接近target的k个值。