二叉树?对称!
题目:
给定一个二叉树,检查它是否是镜像对称的
例子:
二叉树 [1,2,2,3,4,4,3] 是对称的
— 1
– /—\
–2----2
-/-\ – /-\
3 4-- 4 3
题目分析
- 对称二叉树
1.左右子树 ==> 结构相同
2.左右子树 ==> 对应位置数字相同
二叉树对称 ==> 左右子树相同
对于当前根结点
左子树的右子树 右子树的左子树 相同
左子树的左子树 右子树的右子树 相同
即
递归 !!
判断每个结点的左右子树是否相同即可
解题思路
函数 | 作用 |
---|---|
judge(TreeNodea,TreeNodeb) | 判断两颗二叉树是否相同 |
过程:
-
两棵树的根结点数值不同
==> return false -
两棵树的根结点都无左右子树(说明递归遍历到叶子节点)
==>return true -
两棵树的根结点的左右子树均存在
==>
左子树的右子树–右子树的左子树相同
左子树的左子树–右子树的右子树相同
==>return true -
两棵树的根结点的 左右子树结构不对应
==>
有一棵树的左子树存在而另一颗树的右子树不存在
有一棵树的右子树存在而另一棵树的左子树不存在
==>return false -
两棵树的根结点的左右子树不都存在但结构对应
==>
有一棵树的左子树存在另一棵树的右子树对应存在
有一棵树的右子树存在另一棵树的左子树对应存在
==>递归判断对应子树是否相同
代码如下
bool judge(TreeNode*a,TreeNode*b)
{
if(a->val != b->val) return false;
if(!a->right && !b->left && !a->left && !b->right) return true; //递归遍历到叶子结点
if(a->right && b->left&&a->left && b->right)
{
return (judge(a->right, b->left)&&judge(a->left, b->right));
}
if((a->right==NULL&& b->left)||(a->right&& b->left ==NULL) ||(a->left==NULL&& b->right)
||(a->left&& b->right ==NULL) ) return false; //a b树子树结构不对应
if (a->right && b->left ) return judge(a->right, b->left); //a树的右子树且b树的左子树存在
if (a->left && b->right) return judge(a->left, b->right); //a树的左子树且b树的右子树存在
return false;
}
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
if(!root -> left && !root -> right) return true;
if(root -> left && root -> right)
return judge(root->left, root->right);
else return false;
}
};