input: Write a function to determine if two binary trees are similar. The function should return True if both trees have the same structure and corresponding nodes have the same value, and False otherwise. If both trees are empty, return True.
  
  class TreeNode:
      def __init__(self, x):
          self.val = x
          self.left = None
          self.right = None
  
  def are_similar(root1, root2):
      if root1 is None and root2 is None:
          return True
      if (root1 is None) != (root2 is None):
          return False
      if root1.val != root2.val:
          return False
      return are_similar(root1.left, root2.left) and are_similar(root1.right, root2.right)
  
  # Test cases
  root1 = TreeNode(1)
  root1.left = TreeNode(2)
  root1.right = TreeNode(3)
  
  root2 = TreeNode(1)
  root2.left = TreeNode(2)
  root2.right = TreeNode(3)
  
  assert are_similar(root1, root2) == True
  
  root3 = TreeNode(1)
  root3.left = TreeNode(2)
  
  root4 = TreeNode(1)
  root4.right = TreeNode(2)
  
  assert are_similar(root3, root4) == False
  
  root5 = TreeNode(1)
  root5.left = TreeNode(2)
  root5.right = TreeNode(1)
  
  root6 = TreeNode(1)
  root6.left = TreeNode(1)
  root6.right = TreeNode(2)
  
  assert are_similar(root5, root6) == False
output: def are_similar(root1, root2):
      if root1 is None and root2 is None:
          return True
      if (root1 is None) != (root2 is None):
          return False
      if root1.val != root2.val:
          return False
      return are_similar(root1.left, root2.left) and are_similar(root1.right, root2.right)