题目描述:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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的左子树和树2的右子树是否互为镜像,同时也比较树1的右子树和树2的左子树是否互为镜像。如果满足上面一系列条件,则说明以当前两个根节点为根节点的两颗树互为镜像。
代码:
方法一:递归
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==NULL)return 1;
return judge(root->left,root->right);
}
int judge(TreeNode * root1,TreeNode *root2){
if(!root1&&!root2)return 1;
else if(root1&&root2&&root1->val==root2->val&&judge(root1->left,root2->right)&&judge(root1->right,root2->left))return 1;
else return 0;
}
};
方法二:层次遍历
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==NULL)return 1;
queue<TreeNode *>q;
q.push(root);
while(!q.empty()){
queue<TreeNode *>qt;
vector<int>ans;
while(!q.empty()){
TreeNode * temp=q.front();
q.pop();
if(temp->left){
qt.push(temp->left);
ans.push_back(temp->left->val);
}else{
ans.push_back(0);
}
if(temp->right){
qt.push(temp->right);
ans.push_back(temp->right->val);
}else{
ans.push_back(0);
}
}
q=qt;
if(judge(ans)==0)return 0;
}
return 1;
}
int judge(vector<int>ans){
int n=ans.size()-1;
for(int i=0;i<=n;i++,n--){
if(ans[i]!=ans[n])
return 0;
}
return 1;
}
};
代码有点复杂,开始没考虑到空结点的情况,最后靠补0来代替,最后调试了很久才调试出来。