code: def insert(self, point, data=None):
          
          assert len(point) == self.k
  
          if self.size == 0:
              if self.region is None:
                  self.region = [[-math.inf, math.inf]] * self.k
              axis = 0
              return self.new_node(point, self.region, axis, data)
  
          # Iteratively descends to one leaf
          current_id = 0
          while True:
              parent_node = self.node_list[current_id]
              axis = parent_node.axis
              if point[axis] < parent_node.point[axis]:
                  next_id, left = parent_node.left, True
              else:
                  next_id, left = parent_node.right, False
  
              if next_id is None:
                  break
  
              current_id = next_id
  
          # Get the region delimited by the parent node
          region = parent_node.region[:]
          region[axis] = parent_node.region[axis][:]
  
          # Limit to the child's region
          limit = parent_node.point[axis]
  
          # Update reference to the new node
          if left:
              self.node_list[current_id] = parent_node._replace(left=self.size)
              region[axis][1] = limit
          else:
              self.node_list[current_id] = parent_node._replace(right=self.size)
              region[axis][0] = limit
  
          return self.new_node(point, region, (axis + 1) % self.k, data)
docs: Insert a new node in the tree.
  
          Args:
              point (:obj:`tuple` of float or int): Stores the position of the
                  node.
              data (:obj, optional): The information stored by the node.
  
          Returns:
              int: The identifier of the new node.
  
          Example:
              >>> tree = Tree(4, 800)
              >>> point = (3, 7)
              >>> data = {'name': Fresnel, 'label': blue, 'speed': 98.2}
              >>> node_id = tree.insert(point, data)