def is_symmetrical(root: Optional[TreeNode]) -> bool:
        
        stack = [(root, root)]
        
        while stack:
            
            node1, node2 = stack.pop()
            
            if (not node1 and node2) or (not node2 and node1):
                return False
            
            elif not node1 and not node2:
                continue
            
            elif node1 and node2 and node1.val != node2.val:
                    return False
            
            stack.append([node1.left, node2.right])
            stack.append([node1.right, node2.left])
        
        return True


def is_symmetrical_recursive(root: Optional[TreeNode]) -> bool:
            
            def helper(node1, node2):
                if (not node1 and node2) or \
                   (not node2 and node1) or \
                   (node1 and node2 and node1.val != node2.val):
                        return False
                
                if (not node1 and not node2):
                        return True
                
                return helper(node1.left, node2.right) and helper(node2.left, node1.right)
            
            return helper(root.left, root.right)