code: def search_knn(self, point, k, dist=None):
          
  
          if k < 1:
              raise ValueError("k must be greater than 0.")
  
          if dist is None:
              get_dist = lambda n: n.dist(point)
          else:
              get_dist = lambda n: dist(n.data, point)
  
          results = []
  
          self._search_node(point, k, results, get_dist, itertools.count())
  
          # We sort the final result by the distance in the tuple
          # (<KdNode>, distance).
          return [(node, -d) for d, _, node in sorted(results, reverse=True)]
docs: Return the k nearest neighbors of point and their distances
  
          point must be an actual point, not a node.
  
          k is the number of results to return. The actual results can be less
          (if there aren't more nodes to return) or more in case of equal
          distances.
  
          dist is a distance function, expecting two points and returning a
          distance value. Distance values can be any comparable type.
  
          The result is an ordered list of (node, distance) tuples.