<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def insert(self, point, data=None):
 """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: """

        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)