450. Delete Node in a BST

class Solution:
    def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
        
        if not root:
            return root

        if root.val == key:
            if root.right is None:
                return root.left

            cur = root.right

            while cur.left:
                cur = cur.left

            root.val, cur.val = cur.val, root.val

        root.left = self.deleteNode(root.left, key)
        root.right = self.deleteNode(root.right, key)

        return root