剑指offer(28)

剑指offer(28)

剑指 Offer 28. 对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

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

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

限制:

0 <= 节点个数 <= 1000

DFS 深度优先:

class Solution {
public:
    //二叉树是否对称 就是判断左右子树是否对称 
    bool isSymmetric(TreeNode* root) {
        //根节点为空 则对称
        if(root==nullptr)return true;
        //去比较它的左右子树
        return check(root->left,root->right);
    }
    bool check(TreeNode* rootLeft,TreeNode* rootRight){
        //两个结点 是否相同 不同就false 如果都是nullptr就返回true 都不为nullptr就继续判断
        if(rootLeft==nullptr||rootRight==nullptr)return rootLeft==rootRight;
        if(rootLeft->val!=rootRight->val)return false;
        //对称 左子树的左节点应该等于右子树的右节点
        return check(rootLeft->left,rootRight->right)&&check(rootLeft->right,rootRight->left);
    }
};

BFS 广度优先:

这里给出官方题解,时间和空间复杂度都和DFS差不多

class Solution {
public:
    bool check(TreeNode *u, TreeNode *v) {
        queue <TreeNode*> q;//BFS核心数据结构
        q.push(u); q.push(v);
        while (!q.empty()) {
            u = q.front(); q.pop();
            v = q.front(); q.pop();
            if (!u && !v) continue;
            if ((!u || !v) || (u->val != v->val)) return false;

            q.push(u->left); 
            q.push(v->right);

            q.push(u->right); 
            q.push(v->left);
        }
        return true;
    }

    bool isSymmetric(TreeNode* root) {
        //有趣的是首先放入的两个都是root
        return check(root, root);
    }
};

posted @ 2022-04-28 10:36  BailanZ  阅读(16)  评论(0编辑  收藏  举报