code: def make_tree(data, rng_state, leaf_size=30, angular=False):
      
      is_sparse = scipy.sparse.isspmatrix_csr(data)
      indices = np.arange(data.shape[0])
  
      # Make a tree recursively until we get below the leaf size
      if is_sparse:
          inds = data.indices
          indptr = data.indptr
          spdata = data.data
  
          if angular:
              return make_sparse_angular_tree(
                  inds, indptr, spdata, indices, rng_state, leaf_size
              )
          else:
              return make_sparse_euclidean_tree(
                  inds, indptr, spdata, indices, rng_state, leaf_size
              )
      else:
          if angular:
              return make_angular_tree(data, indices, rng_state, leaf_size)
          else:
              return make_euclidean_tree(data, indices, rng_state, leaf_size)
docs: Construct a random projection tree based on ``data`` with leaves
      of size at most ``leaf_size``.
      Parameters
      ----------
      data: array of shape (n_samples, n_features)
          The original data to be split
      rng_state: array of int64, shape (3,)
          The internal state of the rng
      leaf_size: int (optional, default 30)
          The maximum size of any leaf node in the tree. Any node in the tree
          with more than ``leaf_size`` will be split further to create child
          nodes.
      angular: bool (optional, default False)
          Whether to use cosine/angular distance to create splits in the tree,
          or euclidean distance.
      Returns
      -------
      node: RandomProjectionTreeNode
          A random projection tree node which links to its child nodes. This
          provides the full tree below the returned node.