leetcode.101(对称二叉树)

给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值