input: Write a python function to create a binary search tree (BST) and add functionality to delete a node from the BST.
  assert bst.delete(5) == True
  assert bst.delete(10) == True
  assert bst.delete(15) == False
output: class TreeNode:
      def __init__(self, key):
          self.left = None
          self.right = None
          self.val = key
  
  class BST:
      def __init__(self):
          self.root = None
  
      def insert(self, key):
          if self.root is None:
              self.root = TreeNode(key)
          else:
              self._insert(self.root, key)
      
      def _insert(self, root, key):
          if key < root.val:
              if root.left is None:
                  root.left = TreeNode(key)
              else:
                  self._insert(root.left, key)
          else:
              if root.right is None:
                  root.right = TreeNode(key)
              else:
                  self._insert(root.right, key)
      
      def delete(self, key):
          self.root, deleted = self._delete(self.root, key)
          return deleted
      
      def _delete(self, root, key):
          if root is None:
              return root, False
          
          if key < root.val:
              root.left, deleted = self._delete(root.left, key)
          elif key > root.val:
              root.right, deleted = self._delete(root.right, key)
          else:
              deleted = True
              if root.left is None:
                  return root.right, deleted
              elif root.right is None:
                  return root.left, deleted
              min_larger_node = self._get_min(root.right)
              root.val = min_larger_node.val
              root.right, _ = self._delete(root.right, min_larger_node.val)
          
          return root, deleted
      
      def _get_min(self, root):
          while root.left is not None:
              root = root.left
          return root