/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pRoot TreeNode类 
 * @return bool布尔型
 */
 //方法:递归(二叉树大部分问题都是用递归解决)
 //思路:
    //特殊:根节点不用比较,需要比较的根节点的左右孩子,
    //接下来比较的左孩子的左孩子节点与右孩子的右孩子节点,左孩子的右孩子节点与右孩子的左孩子节点,递归下去
//递归出口:两个节点同时为空或者两个节点相等

//步骤
//主函数:
    //1、判空树,空则返回true,否则进行下一步
    //2、调用局部函数判断左右子树是否相等,并返回其值
//局部函数
    //1、判断左右孩子是否为空,空着返回true,否则返回false
    //2、判断左右子树是是否相等,相等返回true,否则进行下一步
    //3、调用递归来判断(左孩子的左孩子节点与右孩子的右孩子节点,左孩子的右孩子节点与右孩子的左孩子节点是否都相等),相等返回true,否则若只有其中某一方为空,返回false

//局部函数:
int equal(struct TreeNode* lChild, struct TreeNode* rChild)
{
    //1、判断左右孩子是否为空,空着返回true,否则若只有其中某一方为空,返回false
    if(!lChild && !rChild)
    {
        return true;
    }
    else if ((!lChild && rChild) || (lChild && !rChild)) 
    {
        return false;
    }

    //2、判断左右子树是是否相等,相等返回true,否则进行下一步
    if(lChild->val == rChild->val)
    {
        if(equal(lChild->left, rChild->right) && equal(lChild->right, rChild->left))
            return true;
        else
            return false;
    }
    else 
        return false;

    //3、调用递归来判断(左孩子的左孩子节点与右孩子的右孩子节点,左孩子的右孩子节点与右孩子的左孩子节点是否都相等),相等返回true,否则返回false
}

//主函数:
bool isSymmetrical(struct TreeNode* pRoot )
 {
    // write code here
    //1、判空树,空则返回true,否则进行下一步
    if(!pRoot)
    {
        return true;
    }

    //2、调用局部函数判断左右子树是否相等,并返回其值
    return equal(pRoot ->left, pRoot->right);
}