关注公众号:【THU小鱼干杂货铺】
不间断分享LeetCode优质解题思路、大厂算法题解、学习资料等
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
限制:
0 <= 节点个数 <= 1000
笔记:
判断一棵树是否是对称的二叉树,可先将二叉树进行镜像旋转,
如果还是本身,那么说明这是一棵对称的二叉树。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode* root) {
TreeNode* sym = symetric(root);//进行镜像旋转,得到一棵新的二叉树
if(isSame(sym,root))
return true;
else
return false;
}
//进行镜像转换
TreeNode* symetric(TreeNode* root){
if(root==NULL) return NULL;
TreeNode* res = new TreeNode(root->val);
res->left = symetric(root->right);
res->right = symetric(root->left);
return res;
}
//判断两棵二叉树是否相等
bool isSame(TreeNode* a,TreeNode* b){
if(a==NULL&&b==NULL) return true;
if(a==NULL&&b!=NULL) return false;
if(a!=NULL&&b==NULL) return false;
if(a->val==b->val){
return isSame(a->left,b->left)&&isSame(a->right,b->right);
}
return false;
}
};
代码:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==NULL) return true;
return recur(root->left,root->right);
}
bool recur(TreeNode* l,TreeNode* r){
if(l==NULL&&r==NULL) return true;
if(l==NULL||r==NULL||l->val!=r->val) return false;
return recur(l->left,r->right)&&recur(l->right,r->left);
}
};