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星)

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

相关推荐
code_pgf1 小时前
Octo 算法详解-开源通用机器人策略模型技术报告
算法·机器人·开源
嘻嘻哈哈樱桃1 小时前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划
脱氧核糖核酸__1 小时前
LeetCode热题100——234.回文链表(两种解法)
c++·算法·leetcode·链表
IronMurphy1 小时前
【算法四十二】118. 杨辉三角 198. 打家劫舍
算法
电科一班林耿超1 小时前
第 16 课:动态规划专题(二)—— 子序列与子数组问题:面试最高频的 DP 题型
数据结构·算法·动态规划
生信研究猿2 小时前
leetcode 416. 分割等和子集
算法·leetcode·职场和发展
hnjzsyjyj2 小时前
洛谷 B3622:枚举子集(递归实现指数型枚举)← DFS
数据结构·dfs
狗哥哥2 小时前
面包屑自动推导的算法设计:从“最短路径匹配”到工程可落地
算法·架构
6Hzlia3 小时前
【Hot 100 刷题计划】 LeetCode 24. 两两交换链表中的节点 | C++ 精准指针舞步
c++·leetcode·链表