code: def remove(self, point, node=None):
          
  
          # Recursion has reached an empty leaf node, nothing here to delete
          if not self:
              return
  
          # Recursion has reached the node to be deleted
          if self.should_remove(point, node):
              return self._remove(point)
  
          # Remove direct subnode
          if self.left and self.left.should_remove(point, node):
              self.left = self.left._remove(point)
  
          elif self.right and self.right.should_remove(point, node):
              self.right = self.right._remove(point)
  
          # Recurse to subtrees
          if point[self.axis] <= self.data[self.axis]:
              if self.left:
                  self.left = self.left.remove(point, node)
  
          if point[self.axis] >= self.data[self.axis]:
              if self.right:
                  self.right = self.right.remove(point, node)
  
          return self
docs: Removes the node with the given point from the tree
  
          Returns the new root node of the (sub)tree.
  
          If there are multiple points matching "point", only one is removed. The
          optional "node" parameter is used for checking the identity, once the
          removeal candidate is decided.