class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot)
    {
        if (pRoot == nullptr) return true;
        vector<TreeNode*> tvec;
        tvec.push_back(pRoot);
        while (!tvec.empty()){
            auto length = tvec.size();
            // 检查一层是否镜像 vec中有空节点,不能直接->val
            for (int i = 0; i != length / 2; ++i){
                //一空一不空
                if (tvec[i] == nullptr ^ tvec[length - 1 - i] == nullptr)
                    return false;
                //两个都不空
                else if (tvec[i] != nullptr){
                    if (tvec[i]->val != tvec[length - 1 - i]->val)
                        return false;
                }
            }
            // 更新vec
            for (decltype(length) i = 0; i != length; ++i){
                if (tvec.front() != nullptr){
                    tvec.push_back(tvec.front()->left);
                    tvec.push_back(tvec.front()->right);
                }
                tvec.erase(tvec.begin());
            }
        }
        return true;
    }
};

有参考别人的想法
1、对称的二叉树就是每一层都是对称的,故考虑广度优先搜索
2、因为要用到下标访问,所以用vector、不用queue
3、空树返回true,一开始想反了。