对称二叉树,力扣

news2024/9/22 20:40:56

题目地址:

101. 对称二叉树 - 力扣(LeetCode)

难度:简单

今天刷对称二叉树,大家有兴趣可以点上面链接,看看题目要求,试着做一下

题目:

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

我们直接看题解吧:

快速理解解题思路小建议:

可以先简单看一下解题思路,然后照着代码看思路,会更容易理解一些

解题方法:

方法1,递归

方法2,迭代

解题分析:

对称二叉树定义: 对于树中 任意两个对称节点 L 和 R ,一定有:

    ·L.val = R.val :即此两对称节点值相等。

    ·L.left.val = R.right.val :即 L的 左子节点 和 R的右子节点 对称。

    ·L.right.val = R.left.val :即 L的 右子节点 和 R的左子节点对称。

根据以上规律,考虑从顶至底递归,判断每对左右节点是否对称,从而判断树是否为对称二叉树。

解题思路(递归)

主要设计一个递归函数,通过‘同步移动两个指针的方法遍历树,利用两个指针从根节点开始向左右子树移动,每次检查当前节点的值是否相等,若相等再判断左右子树是否对称。

算法流程:

1、在函数 isSymmetric(root) :

    特例处理: 若根节点 root 为空,则直接返回 true。

    返回值: 即 check(root.left, root.right) ;

2、函数check(L, R):

    终止条件:

         ·当 L  R 同时越过叶节点: 此树从顶至底的节点都对称,因此返回 true 。

         ·当 LR中只有一个越过叶节点: 此树不对称,因此返回 false。

        · 当节点 L 值 ≠ 节点 R 值:此树不对称,因此返回 false。

3、递推工作:

     判断两节点 L.left 和 R.right 是否对称,即 check(L.left, R.right) 。

     判断两节点 L.right 和 R.left 是否对称,即 check(L.right, R.left) 。

    返回值: 两对节点都对称时,才是对称树,因此用与逻辑符 && 连接。

代码实现:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return check(root, root);
    }

    public boolean check(TreeNode L, TreeNode R) {
        if ( L == null && R== null) {
            return true;
        }
        if ( L == null || R== null|| L.val == R.val) {
            return false;
        }
        return check( L.left, R.right) && check( L.right,R.left);
    }
}

解题思路(迭代)

  首先引入一个队列(递归改迭代的常用方法)。

初始化时,将根节点入队两次,每次提取节点比较节点值(队列每两个连续节点应相等,且其子树互为镜像)

接着将两节点的左右子节点以相反顺序插入队列中。

最后当队列为空,或树不为空时结束

代码实现:

class Solution {
public:
    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 && !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) {
        return check(root, root);  //调用check方法
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1404463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

区块链社交:Facebook在去中心化时代的探索

随着区块链技术的崛起&#xff0c;数字社交领域也正迎来一场革命。Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;不甘落后&#xff0c;积极探索区块链的应用前景。本文将深入探讨Facebook在去中心化时代对区块链社交的探索&#xff0c;以及这一探索可能引发…

控制项目进展

优质博文 IT-BLOG-CN 假如一个项目准备工作做的非常周详&#xff0c;现在要做的就是监督项目的进展情况&#xff0c;理想状况下事情应当进展的很顺利&#xff0c;但实际上我们会发现项目永远不会完全按照经计划执行&#xff0c;我们必须进行项目控制。也就是我们需要不断进行调…

基于springboot+vue的在线文档管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 背景和意…

[ACM学习]自上而下树形dp

问题引入 设置dp状态&#xff0c;相比于更容易出错的贪心更...不易出错。 状态设计 如果选择父结点&#xff0c;就会使孩子结点不能被选择&#xff0c;我们会多开一维的dp&#xff0c;用来标记该点是否被标记过。 以1点举例&#xff0c;f[1][0]为不选它的状态&#xff0c;那么…

使用双异步后,如何保证数据一致性?

目录 一、前情提要二、通过Future获取异步返回值1、FutureTask 是基于 AbstractQueuedSynchronizer实现的2、FutureTask执行流程3、get()方法执行流程 三、FutureTask源码具体分析1、FutureTask源码2、将异步方法的返回值改为Future<Integer>&#xff0c;将返回值放到new…

Databend 开源周报第 129 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持标准流 标…

关于图像分割项目的可视化脚本

1. 前言 之前实现了目标检测和图像分类任务的可视化脚本&#xff0c;本章将最后一个分割任务的可视化脚本实现 效果展示如下&#xff1a; 代码会在当前目录保存展示好的图片&#xff0c;从左到右依次为&#xff0c;原图、mask图、mask覆盖在原图的掩膜图 关于目标检测的可视化…

x-cmd pkg | hurl - HTTP 请求处理工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 Hurl 是 HTTP 请求处理工具&#xff0c;支持使用简单的纯文本格式定义的 HTTP 请求。它的用途非常广泛&#xff0c;既可以用于获取数据&#xff0c;也可以用于测试HTTP会话。 它可以链式处理请求&#xff0c;捕获数值…

在Go中处理HTTPS请求:一场加密的舞蹈

嘿&#xff0c;Go语言的爱好者们&#xff0c;你们准备好跳一场加密的舞蹈了吗&#xff1f;今天&#xff0c;我们要一起探讨如何在Go中处理那些神秘的HTTPS请求。 首先&#xff0c;我们要明白HTTPS是什么。简单来说&#xff0c;HTTPS就是给HTTP穿上了一层"加密的外套"…

如何根据openai官网的FileID下载文件

我的chatgpt网站&#xff0c;哈哈&#xff1a; https://chat.xutongbao.top/ file-type的版本需要注意&#xff1a; "file-type": "^15.0.0", const FileType require(file-type)const assistantsDownloadFileOnAzure async (req, res) > {let { apiK…

抖音出的AI工具火了!自动生成抖音文案,一键脚本数字人成片!

一些结论 抖音即创是一个一站式的智能创意生产与管理平台。 视频创作: AI视频脚本、数字人、一键成片 图文创作: 商品卡、图文工具 直播创作: AI背景、AI文案 抖音即创目前处于公测&#xff0c;全部功能免费使用&#xff01; 抖音即创是什么&#xff1f; “抖音即创”是一…

复杂高层建筑环境多模态导航服务和引导管理机器人系统设计(预告)

课题基础 机器人工程ROS方向应用型本科毕业设计重点课题学生验收成果 将上面这篇所涉及的算法等应用到如下环境中。 Gazebo新环境AWS RoboMaker Hospital医院场景适用于ROS1和ROS2 高层可以简化为多层测试。最典型的就是两层及以上。 简介 随着城市化进程的加速和高层建筑…

08-微服务Seata分布式事务使用

一、分布式事务简介 1.1 概念 事务ACID&#xff1a; A&#xff08;Atomic&#xff09;&#xff1a;原子性&#xff0c;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么全部不执行&#xff0c;不可能出现部分成功部分失 败的情况。 C&#xff08;Consistency&…

软件设计师——法律法规(四)

&#x1f4d1;前言 本文主要是【法律法规】——软件设计师——法律法规的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

encodeURI 和 encodeURIComponent

encodeURI 和 encodeURIComponent 是用来处理加密 decodeURI 和 decodeURIComponent 是用来处理解密 encodeURI 和encodeURIComponent 区别&#xff1a; 唯一区别就是编码的字符范围 encodeURI方法不会对下列字符编码 ASCII字母 数字 ~!#$&():/,;?’ encodeURIComponent方…

电脑录屏软件大比拼,哪个最适合你?

现如今&#xff0c;电脑录屏软件成为了许多用户记录、分享和教学的重要工具。从游戏玩家到专业制作人员&#xff0c;都需要高效的录屏软件。本文将介绍三款优秀的电脑录屏软件&#xff0c;通过详细的步骤和简洁的介绍&#xff0c;帮助用户轻松掌握这些工具的使用方法。 电脑录屏…

基于springboot+vue的台球管理系统

摘要 台球管理系统是一款基于Spring Boot和Vue.js技术栈构建的现代化系统&#xff0c;旨在提供全面而高效的台球场馆管理服务。该系统通过整合前后端技术&#xff0c;实现了场馆预约、会员管理、比赛统计等核心功能&#xff0c;为台球场馆管理员和玩家提供了便捷、智能的管理和…

在铸造铸铁平台时应用工艺有哪些——河北北重

铸造铸铁平台时&#xff0c;常用的工艺包括砂型铸造、金属型铸造和连铸工艺。 砂型铸造&#xff1a;砂型铸造是最常用的铸造工艺之一&#xff0c;适用于中小型铸铁平台的生产。该工艺使用砂模具&#xff0c;将铁水倒入模具中&#xff0c;待冷却后取出成型。砂型铸造工艺成本较低…

Flutter 滚动布局:sliver模型

一、滚动布局 Flutter中可滚动布局基本都来自Sliver模型&#xff0c;原理和安卓传统UI的ListView、RecyclerView类似&#xff0c;滚动布局里面的每个子组件的样式往往是相同的&#xff0c;由于组件占用内存较大&#xff0c;所以在内存上我们可以缓存有限个组件&#xff0c;滚动…

说说你对选择排序的理解?如何实现?应用场景?

一、是什么 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法&#xff0c;无论什么数据进去都是 O(n) 的时间复杂度&#xff0c;所以用到它的时候&#xff0c;数据规模越小越好 其基本思想是&#xff1a;首先在未排序的数列中找到最小(or最大)元素&a…