/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
#include <stack>
#include <vector>
class Solution {
public:

  //开始以为求中序遍历,按回文数那样就可以,后来发现不行,一种遍历不能确定一颗树,也就是有多颗树对应这个遍历    序列,所以特殊的过不了,看了下评论区的大佬的
    // void Inordertraversal(vector<int>&num,TreeNode *pRoot)
    // {
    //     stack<TreeNode*>st;
    //     while(pRoot||!st.empty())
    //     {
    //         if (pRoot) 
    //         {
    //             st.push(pRoot);
    //             pRoot = pRoot->left;
    //         }
    //         else 
    //         {
    //             pRoot = st.top();
    //             num.push_back(pRoot->val);
    //             st.pop();
    //             pRoot = pRoot->right;
    //         }
    //     }
    // }
    // bool isSymmetrical(TreeNode* pRoot) 
    // {
    //     vector<int> num;
    //     Inordertraversal(num,pRoot);
    //     for(int i=0;i<(num.size()/2);i++)
    //     {

    //         if (num[i] != num[num.size() - i - 1]) 
    //         {
    //             return false;
    //         }
    //     }
    //     return true;
    // }

    //两个指针同时移动
    bool DoublePointer(TreeNode* left,TreeNode* right)
    {
        //同为空,return true
        if (!left&&!right) return true;
        //不同为空,return false
        if (!left||!right) return false;
        //同时不为空,比较值,将对应节点做递归调用
        return left->val == right->val&&
        DoublePointer(left->left,right->right)&&
        DoublePointer(left->right,right->left);
    }
    bool isSymmetrical(TreeNode* pRoot)
    {
        //树空,return true
        if(!pRoot) return true;
        return DoublePointer(pRoot->left,pRoot->right);
    }
};