LeetCode 101:对称二叉树(多语言解法)

题目LeetCode 101

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

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

Python解法

解法一(递归)

python 复制代码
class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        return self.check(root.left, root.right)
    def check(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
        #如果都为空
        if p is None and q is None:
            return True
        #如果有一个为空
        if p is None or q is None:
            return False
        #不断递归
        return p.val == q.val and self.check(p.left, q.right) and self.check(p.right, q.left)

解法二(迭代)

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

from collections import deque

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        # 入口:检查根节点自己和自己是否对称
        return self.check(root, root)

    # 检查 u 和 v 这两棵树是否镜像对称
    def check(self, u: TreeNode, v: TreeNode) -> bool:
        q = deque()
        q.append(u)  # 第一个节点
        q.append(v)  # 镜像节点

        while q:
            # 每次取出一对:左边一个、右边一个
            u = q.popleft()
            v = q.popleft()

            # 都为空 → 对称,继续
            if u is None and v is None:
                continue

            # 一个空一个不空 或 值不相等 → 不对称
            if (u is None or v is None) or (u.val != v.val):
                return False

            # 关键:按镜像顺序入队!
            # u的左 对应 v的右
            q.append(u.left)
            q.append(v.right)

            # u的右 对应 v的左
            q.append(u.right)
            q.append(v.left)

        # 全部比较完都没问题 → 对称
        return True

Java解法

解法一(递归)

java 复制代码
class Solution{
    public boolean isSymmetric(TreeNode root){
        return check(root.left, root.right);
    }
    public boolean check(TreeNode p, TreeNode q){
        if(p == null && q == null){
            return true;
        }
        if(p == null || q == null){
            return false;
        }
        return p.val == q.val && check(p.left, q.right) && check(p.right, q.left);
    }
}

解法二(迭代)

java 复制代码
class Solution {
    public boolean isSymmetric(TreeNode root) {
        // 入口:检查根节点自己和自己是否对称
        return check(root, root);
    }

    // 检查 u 和 v 这两棵树是否镜像对称
    public boolean check(TreeNode u, TreeNode v) {
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(u); // 第一个节点
        q.offer(v); // 镜像节点

        while (!q.isEmpty()) {
            // 每次取出一对:左边一个、右边一个
            u = q.poll();
            v = q.poll();

            // 都为空 → 对称,继续
            if (u == null && v == null) {
                continue;
            }

            // 一个空一个不空 或 值不相等 → 不对称
            if ((u == null || v == null) || (u.val != v.val)) {
                return false;
            }

            // 关键:按镜像顺序入队!
            // u的左 对应 v的右
            q.offer(u.left);
            q.offer(v.right);

            // u的右 对应 v的左
            q.offer(u.right);
            q.offer(v.left);
        }

C++解法

解法一(递归)

cpp 复制代码
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        return check(root->left, root->right);
    }

    bool check(TreeNode* p, TreeNode* q) {
        if (p == nullptr && q == nullptr)
            return true;
        if (p == nullptr || q == nullptr)
            return false;
        return p->val == q->val 
            && check(p->left, q->right) 
            && check(p->right, q->left);
    }
};

解法二(迭代)

cpp 复制代码
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        return check(root, root);
    }

    bool check(TreeNode* u, TreeNode* v) {
        queue<TreeNode*> q;
        q.push(u);
        q.push(v);

        while (!q.empty()) {
            u = q.front();
            q.pop();
            v = q.front();
            q.pop();

            // 都为空,继续
            if (u == nullptr && v == nullptr)
                continue;

            // 一个空一个不空 或 值不等
            if ((u == nullptr || v == nullptr) || (u->val != v->val))
                return false;

            // 镜像入队
            q.push(u->left);
            q.push(v->right);

            q.push(u->right);
            q.push(v->left);
        }
        return true;
    }
};
相关推荐
小陈的进阶之路1 小时前
Python系列课(11)——PySpark
开发语言·python·ajax
WL_Aurora1 小时前
备战蓝桥杯国赛【Day 12】
python·蓝桥杯
宏笋1 小时前
C++ 回调函数详解和常用场景
开发语言·c++
Cloud_Shy6181 小时前
Python 数据分析基础入门:《Excel Python:飞速搞定数据分析与处理》学习笔记系列(第八章 使用读写包操作 Excel 文件 下篇)
python·数据分析·excel·numpy·pandas
tryCbest1 小时前
Flask vs FastAPI 全方位对比与实战
python·flask·fastapi
测试员周周1 小时前
【Appium 系列】第04节-Page Object 模式 — BasePage 基类设计
开发语言·数据库·人工智能·python·语言模型·appium·web app
无限中终1 小时前
如何抓取某音视频的互动数据
爬虫·python
折哥的程序人生 · 物流技术专研1 小时前
《Java 100 天进阶之路》第14篇:Java final关键字详解
java·开发语言·后端·面试
Cosmoshhhyyy1 小时前
《Effective Java》解读第 52 条:慎用重载
java·开发语言·windows