题目描述:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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来代替,最后调试了很久才调试出来。