每天一道leetcode 对称二叉树(递归和迭代)

101. 对称二叉树

难度简单825收藏分享切换为英文关注反馈

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [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

答:

递归:

bool check(struct TreeNode* le,struct TreeNode* ri)
{
    if(!le&&!ri) return true;
    if(!le||!ri) return false;
    return le->val==ri->val &&check(le->left,ri->right)&&check(le->right,ri->left);
}
bool isSymmetric(struct TreeNode* root){
    if(!root) return true;   
    return check(root->left,root->right);
}

注意:

  • 发现很多题解包括官方的都没注意到,如果刚开始直接压入两边根节点,那么
 return le->val==ri->val &&check(le->left,ri->right)&&check(le->right,ri->left);

在第一个check递归结束并返回后,第二个check会再便利一边。根节点的两个子节点遍历了两次并且顺序相反。

因为,第一次压入重复了,后面也会重复。

优化,刚开始直接压入左右子节点,注意另加判断跟节点是否位空

迭代:

迭代就是把递归用队列实现,就用的c++

class Solution {
public:
    bool queue_isSymmetric(TreeNode* le,TreeNode *ri) {
        queue <TreeNode*> q;
        q.push(le);
        q.push(ri);
        while(!q.empty())
        {
            le=q.front();q.pop();
            ri=q.front();q.pop();
            if(!le&&!ri) continue;//到达叶子节点或者都为空,结束本轮
            if(!le||!ri||le->val!=ri->val) return false;
            q.push(le->left);
            q.push(ri->right);
            q.push(le->right);
            q.push(ri->left);

        }
        return true;

    }
    bool isSymmetric(TreeNode* root)
    {
        if(!root)
            return true;
        return queue_isSymmetric(root->left,root->right);//不直接压入根节点,防止冗余(除了根节点其他的都会遍历两边)
    }
};
posted @ 2020-06-02 16:58  rower  阅读(143)  评论(0编辑  收藏  举报