hot 100 101. 对称二叉树

对称二叉树


问题描述

给你一个二叉树的根节点 root , 检查它是否轴对称。


样例输入

cpp 复制代码
root = [1,2,2,3,4,4,3]

样例输出

cpp 复制代码
true

评测用例规模与约定

树中节点数目在范围 [1, 1000] 内

-100 <= Node.val <= 100


解析

要判断一棵二叉树是否对称,我们需要比较树的左右子树是否互为镜像。具体来说:

两个根节点具有相同的值

每个树的右子树都与另一个树的左子树镜像对称

我们可以使用递归或迭代的方法来解决这个问题。

递归方法

递归地比较左右子树:

左子树的左孩子与右子树的右孩子比较

左子树的右孩子与右子树的左孩子比较

迭代方法

使用队列或栈来迭代地比较节点:

将根节点的左右子节点入队两次

每次取出两个节点比较

将一个节点的左子节点和另一个节点的右子节点入队

将一个节点的右子节点和另一个节点的左子节点入队


参考程序

cpp 复制代码
//递归
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if (!root) return true;
        return isMirror(root->left, root->right);
    }
    
    bool isMirror(TreeNode* left, TreeNode* right) {
        if (!left && !right) return true;
        if (!left || !right) return false;
        return (left->val == right->val) 
            && isMirror(left->left, right->right) 
            && isMirror(left->right, right->left);
    }
};

//迭代
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root==nullptr)return true;
        queue<TreeNode*>q;
        q.push(root->left);
        q.push(root->right);
        while(!q.empty()){
           TreeNode* l=q.front();q.pop();
           TreeNode* r=q.front();q.pop();
           if(!l&&!r)continue;
           if(!l||!r)return false;
           if(l->val!=r->val)return false;
           q.push(l->left);
           q.push(r->right);
           q.push(l->right);
           q.push(r->left);
        }
        return true;
    }
};

难度等级

⭐️⭐️⭐️(1~10星)

以个人刷题整理为目的,如若侵权,请联系删除~

相关推荐
四处炼丹1 天前
OpenClaw本地部署与Multi-Agent 技术分享
人工智能·算法·aigc·agent·ai编程
Σίσυφος19001 天前
周期 Pattern Removal 算法
算法
飞Link1 天前
深度捕捉时序本质:TSTD 异常检测之表示学习(Representation-based)全解析
学习·算法·数据挖掘·回归
Book思议-1 天前
顺序表和链表核心差异与优缺点详解
java·数据结构·链表
滴滴答滴答答1 天前
机考刷题之 10 LeetCode 200 岛屿数量
算法·leetcode·职场和发展
mit6.8241 天前
Agent memory发展路线
算法
青桔柠薯片1 天前
Linux I/O多路复用:深入浅出poll与epoll
linux·运维·服务器·算法
whn19771 天前
在sqllog中排查达梦阻塞会话
数据结构
哈哈很哈哈1 天前
逻辑回归Logistic Regression
算法·机器学习·逻辑回归
甄心爱学习1 天前
【极大似然估计/最大化后验】为什么逻辑回归要使用交叉熵损失函数
算法·机器学习·逻辑回归