给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
方法一:自己写的垃圾代码,算是迭代吧
先记录一下我对于这道题深深的怨念,明明是一道简单题,却搞了我一晚上,搞到我妈和我男朋友一直催我回宿舍催到我反过来骂人。
终于用自己的方法实现了,写的狗屎一样的代码,又臭又长。
主要是用队列实现的,就是每一层都判断它是不是符合条件,如果符合了条件,再继续下一层。
之前还考虑过直接到底,然后用栈来实现。但是少了一些节点不存在的情况。写了一大段还是不能完全通过。气死本我了。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==NULL)return true;
if(!root->left&&!root->right)return true;
queue<TreeNode*>dl1;
queue<TreeNode*>dl2;
if((root->left&&!root->right)||(root->right&&!root->left)||(root->left&&root->right&&root->left->val!=root->right->val))return false;
TreeNode*cur1;
TreeNode*cur2;
if(root->left)cur1=root->left;
if(root->right)cur2=root->right;
dl1.push(cur1);
dl2.push(cur2);
while(!dl1.empty()&&!dl2.empty()){
cur1=dl1.front();
cur2=dl2.front();
if((!cur1->left&&cur2->right)||(cur1->left&&!cur2->right)||(!cur1->right&&cur2->left)||(cur1->right&&!cur2->left)||(cur1->left&&cur2->right&&cur1->left->val!=cur2->right->val)||(cur1->right&&cur2->left&&cur1->right->val!=cur2->left->val))
return false;
if(cur1->left) dl1.push(cur1->left);
if(cur1->right) dl1.push(cur1->right);
if(cur2->right) dl2.push(cur2->right);
if(cur2->left) dl2.push(cur2->left);
dl1.pop();
dl2.pop();
}
if(dl1.size()==0&&dl2.size()==0)
return true;
else return false;
}
};
方法二:递归
递归真的是代码简短。这是我看了官方题解写的递归,虽然也理解了整个的思路,但是我递归还是不太会写。革命尚未成功,递归仍需努力啊 orz。
class Solution {
public:
bool ismirror(TreeNode*t1,TreeNode*t2){
if(t1==NULL&&t2==NULL)return true;
if(t1==NULL||t2==NULL)return false;
return (t1->val==t2->val && ismirror(t1->left,t2->right) && ismirror(t1->right,t2->left));
}
bool isSymmetric(TreeNode* root) {
return ismirror(root,root);
}
};
方法三:迭代
看了官方题解,才发现我自己写的方法一有点蠢,方法一是将每层的节点从左到右依次插入,队列里就变成了如 1221这样。判断起来比较麻烦。
而官方题解是交叉push进队列。如1122。这样就可以直接对队列中相邻节点进行判断。省事很多。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==NULL)return true;
TreeNode*cur1=root;
TreeNode*cur2=root;
queue<TreeNode*>dl;
dl.push(cur1);
dl.push(cur2);
while(!dl.empty()){
cur1=dl.front();dl.pop();
cur2=dl.front();dl.pop();
if(cur1==NULL&&cur2==NULL)continue;
if(cur1==NULL||cur2==NULL)return false;
if(cur1->val!=cur2->val)return false;
dl.push(cur1->left);
dl.push(cur2->right);
dl.push(cur1->right);
dl.push(cur2->left);
}
return true;
}
};