第二十三题 简单 递归判断左右是否相等
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot) {
        if(pRoot==NULL)
            return true;
        bool ret_ans=true;
        // 如果说 左右两颗子树都是空 则是true
        if(pRoot->left==NULL && pRoot->right == NULL)
            return ret_ans;
        // 如果说一边有 一遍无 则肯定错
        // 因为is_equal 传递的是整个树 所以不需要下面的判断,如果说 传入的只是左子树 和右子树 则要判断
        // if( (pRoot->left == NULL && pRoot->right!=NULL)  || (pRoot->right == NULL && pRoot->left!=NULL))
        //    return false;
        // ret_ans = is_equal(pRoot->left, pRoot->right);
        ret_ans = is_equal(pRoot, pRoot);
        return ret_ans;
    }
    
    // 递归判断 传入左右两棵子树 判断是否相等
    bool is_equal(TreeNode* left,TreeNode* right)
    {
        if(left==NULL && right==NULL)
            return true;
        
        // 如果说一边有 一遍无 则肯定错
        if( (left == NULL && right!=NULL)  || (right == NULL && left!=NULL) || left->val!=right->val )
            return false;

        bool ans=true;
        
        // 镜像判断
        // 递归调用结果 判断是否相等 左边的左子树 和右边的右子树
        ans = is_equal(left->left,right->right);
        // 有错 则往后 肯定都是错的
        if(ans==false)
            return false;
        // 判断 左边的右子树 和 右边的左子树
        ans = is_equal(left->right,right->left);
        return ans;
    }
};