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;
    }
};
相关推荐
甜到心里的蛋糕8 分钟前
云主机部署图片/视频管理系统的实践经验
python·音视频
CV工程师丁Sir11 分钟前
ArkWeb 手记 06|window.open 与页面跳转拦截
开发语言·php·harmonyos
夜不会漫长13 分钟前
C++:内存管理
java·开发语言·c++
小园子的小菜17 分钟前
FastAPI 全方位入门实战:高性能 Python Web 框架开发指南
python·pycharm·fastapi
徐小黑ACG20 分钟前
Golang 基础01
开发语言·后端·golang
Helix25022 分钟前
Python爬虫零基础实战:3步抓取网页数据并导出Excel
爬虫·python·beautifulsoup·excel·python教程·requests·网页数据
进击的大海贼26 分钟前
基于C#开发的久坐提醒工具
开发语言·c#
平生幻30 分钟前
unbuntu虚拟机确认python安装位置
开发语言·python
jason.zeng@150220740 分钟前
(七)「固化 Rest 接口 + Text-to-SQL 灵活查询」双模式 Agent 架构教程
数据库·python·sql·ai·架构·langchain·ai编程
运维行者_41 分钟前
PHP性能监控怎么做?从响应时间到慢函数的6个关键指标
运维·服务器·开发语言·网络·支持向量机·php·接口隔离原则