# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param pRoot TreeNode类 
# @return bool布尔型
#
class Solution:
    def isSymmetrical(self , pRoot: TreeNode) -> bool:
        # write code here
        # 如果为空直接返回
        if not pRoot:
            return True
        node = pRoot
        ls = [node]
        k = 1 # 用于判断是否为根节点
        while ls:
            next_l = []
            if len(ls)==1 and k==1: # 根节点处理
                k=0 # 根节点只处理一次
                if node.left and node.right and node.left.val == node.right.val:
                    next_l.append(node.left)
                    next_l.append(node.right)
                elif not node.left and  not node.right: # 无子节点返回
                    return True
                else: # 左右节点的不能同时匹配
                    return False
            elif len(ls) % 2 != 0 and k==0: # 每一次的节点数必须为双数,否则不对称,返回
                return False
            else:
                for i in range(len(ls)//2):
                    node1 = ls[i]
                    node2 = ls[len(ls)-i-1]
                    if node1.left and node2.right and node1.left.val == node2.right.val:
                        pass
                    elif not node1.left and not node2.right:
                        pass
                    else:
                        return False
                    if node1.right and node2.left and node1.right.val == node2.left.val:
                        pass
                    elif not node1.right and not node2.left:
                        pass
                    else:
                        return False
                for i in range(len(ls)):
                    node = ls.pop(0)
                    if node.left:
                        next_l.append(node.left)
                    if node.right:
                        next_l.append(node.right)
            ls = next_l
        return True