题目
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
解析
二叉树的核心是递归,因此我们只讨论第一层二叉树的情况。
首先讨论特殊值,空树为其自身的镜像,对称;若有左子树没有右子树,或相反,则不对称;若只有根节点,对称。
再来说一般情况,如果有左右子树,那么如果左右子树根节点值不同,则不对称。若相同,则需左子树的左子树根=右子树的右子树根,且左子树的右子树根=右子树的左子树跟。
根据以上思路,写出代码。
代码
int Check(struct TreeNode* left, struct TreeNode* right)
{ //先判断一些特殊情况,即左右分别是否为空
if (left == NULL && right != NULL)
return 0;
if (left != NULL && right == NULL)
return 0;
if (left == NULL && right == NULL)
return 1;
if (left->val == right->val) //如果左根的值等于右根的值,则去检测他们的子树
return (Check(left->left, right->right)&&Check(left->right, right->left));
else
return 0;
}
bool isSymmetrical(struct TreeNode* pRoot ) {
if (pRoot == NULL) //如果是空树,空树一定为其自身的镜像
return 1;
return Check(pRoot->left, pRoot->right); //返回比较的布尔值
}