题目:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
解答:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSymmetric(struct TreeNode* root){
if(root==NULL) return true;
return fun(root->left,root->right);
}
int fun(struct TreeNode* l_root,struct TreeNode* r_root)
{
if(l_root==NULL&&r_root==NULL) return true;//若为空树,返回true
if(l_root==NULL||r_root==NULL) return false;//若一个为空,另一个不为空,则返回false
return (l_root->val==r_root->val)&&fun(l_root->left,r_root->right)
&&fun(l_root->right,r_root->left);
}
解题思路:
如果一个树的左子树与右子树镜像对称,那么这个树是对称的。
因此,该问题可以转化为:两个树在什么情况下互为镜像?
如果同时满足下面的条件,两个树互为镜像:
1.它们的两个根结点具有相同的值。
2.每个树的右子树都与另一个树的左子树镜像对称。
就像人站在镜子前审视自己那样。镜中的反射与现实中的人具有相同的头部,但反射的右臂对应于人的左臂,反之亦然。
用递归的方法:
return (l_root->val==r_root->val)&&fun(l_root->left,r_root->right) &&fun(l_root->right,r_root->left);
1.满足根节点左右子树相等
2.满足左子树的左子树与右子树的右子树相等
3.满足左子树的右·子树与右子树的左子树相等