力扣hot100:101. 对称二叉树(双指针以不同方式递归)

news2024/11/19 0:22:42

LeetCode:101. 对称二叉树
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a02deaab75a04d87988709a8e16c65af.png
看了第一个样例,很容易直接层序遍历看每一层的前后是否相同。但接下来这个样例告诉你,不能这样做。
在这里插入图片描述

层序遍历

仔细思考会发现,层序遍历不能看本结点,但是可以看儿子结点是否对称,本质上是要判断每层的儿子是对称的。

  • 在进行复杂的条件判断时,需要头脑清晰,比如这里需要区分出是否对称。那么在写条件判断的时候,可以这样思考,我们在使得条件为真时,即考虑左右子树对称时,我们只需要将对称时的情况写出:
    • 同时为空
    • 同时不为空,且值相等
  • 就这两种情况,因此我们只需要把这两种情况列在if条件中即可,并不需要杂乱的各种条件都判断。
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root) return true;
        queue<TreeNode *> q;
        q.push(root);
        while(!q.empty()){
            int size = q.size();
            deque<TreeNode *> deq;
            for(int i = 0;i < size;++i){
                deq.push_back(q.front());
                if(q.front()->left)
                    q.push(q.front()->left);
                if(q.front()->right)
                    q.push(q.front()->right);
                q.pop();
            }
            while(!deq.empty()){
                if((deq.front()->left && deq.back()->right && deq.front()->left->val == deq.back()->right->val)|| (!deq.front()->left && !deq.back()->right)){
                    if((deq.front()->right && deq.back()->left && deq.front()->right->val == deq.back()->left->val)|| (!deq.front()->right && !deq.back()->left)){
                        deq.pop_front();
                        if(!deq.empty()) deq.pop_back();
                    }else return false;
                }else return false;
            }
        }
        return true;
    }
};

递归

如何单独查看左右子树,由于两个递归是不能并行的,因此比较难直接进行判断。
这里采用的递归是两个指针同步反向移动

  • 由于左右子树镜像对称,那么从顶端开始,维护两个指针pqp向下左移时,q右移;p向下右移时,q左移。当他们每次都是相同就成功了。
  • 虽然它们在同一个递归中,但是它们走的路线却是镜像的! 并且由于左边和右边都走了,因此可以判断所有镜像的情况。
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        return check(root, root);
    }
    bool check(TreeNode * q,TreeNode * p){//递归函数,判断以p、q为根的子树,是否镜像
        if(!q && !p) return true;//都为空,则这一条路是对的
        if(!q || !p) return false;//不都为空,则不镜像对称
        if(q->val == p->val){
            if(!check(q->left, p->right)) return false;
            if(!check(q->right, p->left)) return false;
        }else return false;
        return true;
    }
};

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

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

相关文章

【b站vue教程】1 宏观视角下的浏览器——前端大厂面试必刷:前后端必学的网络安全浏览器工作原理:从入门到精通全套【附带所有源码】

课程地址&#xff1a;【前端大厂面试必刷&#xff1a;前后端必学的网络安全浏览器工作原理&#xff1a;从入门到精通全套【附带所有源码】】 https://www.bilibili.com/video/BV1UL41157hP/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 1、宏…

计算机毕业设计springboot基于vue电商抢购限时秒杀系统ch0h8

技术栈 ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7以上版本 可选框架&#xff1a;ssmspringboot都有的 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;springbootSSMvueMYSQLMAVEN 数据库工具&#xff1a;Navicat/SQLyog都可以 开发工具 Ec…

树莓派-服务自启配置方式测试

测试脚本&#xff1a; 一、 向rc.local文件添加启动代码(未找到&#xff0c;不测试) 修改/etc/rc.local文件&#xff0c;在文件中exit 0之前添加代码在启动时都会被执行&#xff0c;如&#xff1a;su pi -c “exec /home/pi/testboot.sh” 其中&#xff1a;su pi表示切换至pi…

设计模式之前端控制器模式

想象一下&#xff0c;你的Java Web应用是个交响乐团&#xff0c;每个功能模块是乐手&#xff0c;而用户请求就像是一首首待演绎的曲目。在这场音乐盛宴中&#xff0c;谁来保证演出的流畅与协调&#xff1f;答案就是——前端控制器模式&#xff01;它如同乐队的指挥&#xff0c;…

ORAN C平面优化

使用section扩展6的C平面优化 在时域和频域中&#xff0c;都可以使用section扩展6进行非连续PRB分配。Section扩展6有两个位掩码&#xff1a;symbolMask和rbgMask。使用symbolMask可以选择一个slot内任意的symbol子集。使用rbgMask可以选择startPrbc和&#xff08;startPrbc …

【Linux】搭建私有yum仓库(类阿里云)

在搭建本地yum仓库并配置国内镜像阿里云源中了解yum源 yum &#xff1a; Yellow dog Updater&#xff0c;Modified&#xff0c;是一种基于rpm包的自动升级和软件包管理工具。yum能从指定的服务器自动下载rpm包并安装&#xff0c;自动计算出程序之间的依赖关系和软件安装的步骤&…

golang学习笔记(内存模型和分配机制)

操作系统的存储管理 虚拟内存管理 虚拟内存是一种内存管理技术&#xff0c;它允许操作系统为每个进程提供一个比实际物理内存更大的地址空间。这个地址空间被称为虚拟地址空间&#xff0c;而实际的物理内存则被称为物理地址空间。使用虚拟内存有以下几点好处&#xff1a; 内…

牛客热题:两个链表的第一个公共节点

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;两个链表的第一个公共节点题目链…

【Linux】进程的隔离和控制:namespace 隔离、cgroup 控制

文章目录 五、namespace 隔离dd -- 读取、转换并输出数据mkfs -- 格式化文件系统df -- 显示文件系统磁盘使用情况mount -- 加载文件系统到指定的加载点unshare -- 创建子进程&#xff0c;同时与父程序不共享namespace一个 demo 六、cgroup(Control Group) 相关命令pidstat -- 监…

中药辨别二

声明&#xff1a;参考懒兔子公益课&#xff0c;参考网络资料和部分网络图片整理而成&#xff0c;仅供学习使用&#xff0c;不提供商业活动价值&#xff0c;文章描述的中药仅供学习&#xff0c;请在专业医师或专业医生指导下使用药材&#xff0c;擅自或其他情况下使用&#xff0…

使用Python实现二维码生成工具

二维码的本质是什么&#xff1f; 二维码本质上&#xff0c;就是一段字符串。 我们可以把任意的字符串&#xff0c;制作成一个二维码图片。 生活中使用的二维码&#xff0c;更多的是一个 URL 网址。 需要用到的模块 先看一下Python标准库&#xff0c;貌似没有实现这个功能的…

2024网络安全面试问题宝典(4万字)

2024网络安全厂商面试问题宝典(4万字) 目录 评分标准网络基础问题 TCP建立连接要进行3次握手&#xff08;syn-syn&#xff0c;ack-ack&#xff09;&#xff0c;而断开连接要进行4次&#xff08;fin-ack-fin-ack&#xff09;TCP&#xff0c;UDP区别&#xff1a;安全常用的协议…

ZFile-开源在线网盘(列目录)程序,可以将你各个存储类型的存储源,统一到一个网页中查看、预览、维护

ZFile 是什么&#xff1f; ZFile 是一个适用于个人的在线网盘(列目录)程序&#xff0c;可以将你各个存储类型的存储源&#xff0c;统一到一个网页中查看、预览、维护&#xff0c;再也不用去登录各种各样的网页登录后管理文件&#xff0c;现在你只需要在 ZFile 中使用。你只需要…

排序算法之堆排序

首先在了解堆排序之前我们先来回顾一下什么叫做堆吧&#xff01; 基本概念 堆&#xff08;Heap&#xff09;&#xff1a;是一种特殊的完全二叉树&#xff0c;其中每个节点的值都大于或等于&#xff08;大顶堆&#xff09;或小于或等于&#xff08;小顶堆&#xff09;其子节点的…

Vue 组件间的数据绑定

在Vue组件中&#xff0c;v-model指令可以用来实现双向数据绑定。它用于将组件的属性和父组件中的数据进行双向绑定&#xff0c;使得当属性的值改变时&#xff0c;父组件中的数据也会相应地改变&#xff0c;并且当父组件中的数据改变时&#xff0c;属性的值也会相应地改变。 目…

国内各种免费AI聊天机器人(ChatGPT)推荐(中)

作者主页&#xff1a;点击&#xff01; 国内免费AI推荐(ChatGPT)专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月29日15点20分 随着人工智能技术的不断发展&#xff0c;AI聊天机器人已经逐渐融入我们的日常生活。它们可以提供各种服务&#xff0c;例如聊天、…

python爬虫实战

import requests import json yesinput(输入页数&#xff1a;) yesint(yes)headers {"accept": "application/json, text/plain, */*","accept-language": "zh-CN,zh;q0.9","content-type": "application/json",…

文件同步--Resilio Sync

近期有很多文本处理工作&#xff0c;每次通过社交软件发来发去&#xff0c;比较麻烦&#xff0c;还是希望能够自动同步&#xff0c;方便快捷&#xff0c;然后师弟就给我推荐了Resilio Sync&#xff0c;目前配置完毕&#xff0c;使用下来感受良好&#xff0c;mark一下。 特点 跨…

喝汽水问题

问题描述&#xff1a; 喝汽水&#xff0c;1瓶汽水1元&#xff0c;2个空瓶可以换一瓶汽水&#xff0c;给20元&#xff0c;可以喝多少汽水&#xff08;编程实现&#xff09;。解题思路&#xff1a; 变量解释&#xff1a;money总金额数&#xff0c;price汽水单价&#xff0c;excha…

环形列表 题目分析

一、题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二、思路 1.使用快慢指针&#xff0c;快指针一次走两步&#xff0c;慢指针一次走一步&#xff0c;二者相对速度为1 2.当慢指针刚好进入环时&#xff0c;设二者的相对距离为N 3.如果链表中存在环&#xff…