code: def delete_node(self, root, key):
      """
      :type root: TreeNode
      :type key: int
      :rtype: TreeNode
      """
      if not root:
          return None
  
      if root.val == key:
          if root.left:
              # Find the right most leaf of the left sub-tree
              left_right_most = root.left
              while left_right_most.right:
                  left_right_most = left_right_most.right
              # Attach right child to the right of that leaf
              left_right_most.right = root.right
              # Return left child instead of root, a.k.a delete root
              return root.left
          else:
              return root.right
      # If left or right child got deleted, the returned root is the child of the deleted node.
      elif root.val > key:
          root.left = self.deleteNode(root.left, key)
      else:
          root.right = self.deleteNode(root.right, key)
      return root
  
label_desc: Use image node_id 1 for calling the Solution obj's underlying member method code with example usage: obj.delete_node(root, key) and returns: root, None, root, root