# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

# time O(NlgK)  space O(H+K)
from heapq import heappush, heappop
class Solution:
    def closestKValues(self, root: TreeNode, target: float, k: int) -> List[int]:
        """
        1. inorder traversal to return sorted list // or insert (distance, current node ) into heap 
        2. sort by  num-taret  (distance with target) // or keep size k of heap 
        3. get first k items // or return list of node value 
        """
        hp = []
        def inor(node):
            if not node:
                return 
            inor(node.left)
            heappush(hp,(-abs(node.val-target),node.val))
            if len(hp)> k:
                heappop(hp)
            
            inor(node.right)
            
        inor(root)
        return [v for _, v in hp]

TODO quickselect O(N)