二叉树(OJ)
单值二叉树(力扣)
---------------------------------------------------哆啦A梦的任意门-------------------------------------------------------
我们来看一下题目的具体要求:

既然我们都学了二叉树了,我们就应该学会如何去递归。
分析一下:
我们如果去用遍历的思路去做,肯定是可以做出来的,遍历嘛,先将第一次出现的数给存起来作为一个key,那么遍历整个二叉树,如果出现了一个不同于这个key的数值,那么我们就说这个二叉树不是单值二叉树,如果到最后访问完整个二叉树都没有出现一个不同于这个key的值,那么我们就可以说这个二叉树是一个单值二叉树。
但是看了一下这个思路,一个个遍历是不是显得十分的龊啊?
那么我们就要用二叉树独特的特点,根和它的左子树和右子树进行对比,以此来递归。
我们是不是就突然之间就想出做法了呢?
那么思路如下:
用根的值和左子树和右子树的值进行对比。如果出现一次不相同就可以返回false了。
bool isUnivalTree(struct TreeNode* root){if(root == NULL){return true;}if(root->left != NULL && root->left->val != root->val){return false;}if(root->right != NULL && root->right->val != root->val){return false;}return isUnivalTree(root->left) && isUnivalTree(root->right);}
只要遇到底层的NULL,我们直接返回true,因为只要出现左子树或右子树返回了一个false,整个二叉树就不是单值二叉树了。所以用&&运算符。
二叉树最大深度(力扣)
---------------------------------------------------哆啦A梦的任意门-------------------------------------------------------
来看一下题目要求:

二叉树是由根-左子树-右子树构成的,所以如果要知道二叉树的最大深度,我们就去找到左子树和右子树当中最深的那棵树的具体深度 + 1就是我们这棵树的最大深度了。
那么出现递归结束的条件也是很简单啊,就是我们访问的一个根,这个根如果是空的,我们就可以返回0,别问我为什么不返回1,空的为啥要返回1?
所以来看代码叭~
int maxDepth(struct TreeNode* root){if(root == NULL){return 0;}int left = maxDepth(root->left);int right = maxDepth(root->right);if(left < right){return 1 + right;}return 1 + left;
}
翻转二叉树(力扣)
---------------------------------------------------哆啦A梦的任意门-------------------------------------------------------
还是来看一下题目要求~

光看这个题目完全不懂它的意思,但是一看这个图就明白了。
我们就是需要让一个根的两个子树翻转过来,让一个根的左子树作为它的右子树,它的右子树作为它的左子树。
那么思路就很清晰了,我们的递归结束条件就是当遇到空的时候,我们就返回该结点。
直接来看代码叭~
void swap(struct TreeNode** x1,struct TreeNode** x2)
{struct TreeNode* tmp = *x1;*x1 = *x2;*x2 = tmp;
}
struct TreeNode* invertTree(struct TreeNode* root){if(root == NULL){return root;}swap(&(root->left),&(root->right));invertTree(root->left);invertTree(root->right);return root;
}
如上,我们写了一个交换函数,但是和平时的交换函数好像不太一样啊,为什么这个指针是个二级指针。我们回到这个翻转二叉树的函数当中,我们发现传进去的是root->left和root->right,我们发现这传进去的是一个指针。我们需要改变一个指针,就需要传入一个指针的指针,也就是二级指针,所以,这就是为什么这个交换函数的两个形参是两个二级指针。
检查两颗树是否相同(力扣)
---------------------------------------------------哆啦A梦的任意门-------------------------------------------------------
看题目的要求:

分析一下:
结果为false的几种可能:
1.对比某个结点时,我们发现这两个结点的值不是相等的,那么返回false
2.其中一棵二叉树先遇到了NULL,而另一棵树还没遇到NULL,那么返回false
如果对应的值相等,而且同时出现遇到了NULL,那么我们就返回true。
所以来看代码:
bool isSameTree(struct TreeNode* p, struct TreeNode* q){if(p == NULL && q == NULL){return true;}//若p和q同时都为NULL,就早已return了if(p == NULL || q == NULL){return false;}if(p->val != q->val){return false;}return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}
对称二叉树(力扣)
---------------------------------------------------哆啦A梦的任意门-------------------------------------------------------
看题:

我们来观察一下,根只有一个,肯定是对称的啦,它的两个左右孩子都是相等的,也就是对称的。那么再看它的两个左右孩子的左右孩子,我们可以发现,如果要让这两个子树对称,那么就需要让这棵左子树的右子树等于右子树的左子树,左子树的左子树等于右子树的右子树。
思路:
判断一个树是否对称,首先要判断左右孩子是否对称相等,还需要判断左孩子的左子树是否和右孩子的右子树对称,左孩子的右子树是否和右孩子的左子树对称。
bool check(struct TreeNode* p,struct 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);
}
bool isSymmetric(struct TreeNode* root){return check(root->left,root->right);
}
如果同时为NULL,那么就返回true,如果出现其中一个出现了NULL,另一个没有出现NULL,那么直接返回false
另一颗树的子树(力扣)
---------------------------------------------------哆啦A梦的任意门-------------------------------------------------------
先来看一下题目的要求:

这个像不像上面的有一道题?那道比较两个树是否相等的题。
其实对比两个树是否相等的思路是一样的,只不过我们要找到是否这棵子树是否存在于另一棵树当中。
我们是不是先去root找到一个与subRoot的根节点一样的结点呢?
之后往下比较两棵树是否相等就好了?
那么我们还是从根出发,去它的左子树和右子树去寻找这一棵能和subRoot能完全吻合的子树。
如果在左子树找不着,那就去右子树找,如果都找不到,那么就只能返回一个false了
来看代码:
bool isSame(struct TreeNode* s, struct TreeNode* t)
{if(!s && !t)return true;if(!s || !t)return false;if(s->val != t->val)return false;return isSame(s->left,t->left) && isSame(s->right,t->right);
}
bool isSubtree(struct TreeNode* s, struct TreeNode* t) {if(!s)return false;if(isSame(s,t))return true;return isSubtree(s->left,t) || isSubtree(s->right,t);
}
从这段代码,我们的思路还是比较清晰的。
我们从根出发,先看看这个根开始,能不能与这棵子树吻合,如果不吻合就继续往下走,结束的条件也就是我们遇到了NULL,说明这个根已经到了底下了,不可能再有结点了,直接返回来。
相关文章:
二叉树(OJ)
单值二叉树(力扣) ---------------------------------------------------哆啦A梦的任意门------------------------------------------------------- 我们来看一下题目的具体要求: 既然我们都学了二叉树了,我们就应该学会如何去…...
mysql中增删改成的练习
文章目录一、表的创建1.student表的数据2、课程表的数据course3、学生成绩表的数据二、操作序列1、查询计算机系cs的全体学生学号、姓名和性别2、检索选修了课程号为2的学生号和姓名3、检索至少选修了三门课以上的学生号4、检索选修了全部课程的学生5、在原表的基础上创建一个视…...
谈一谈Java的ThreadLocal
目录 先说原理: 再上代码: 运行结果: 先说原理: ThreadLocal 是一个本地线程副本变量工具类,它可以在每个线程中创建一个副本变量,每个线程可以独立地修改自己的副本变量,而不会影响其他线程…...
边缘检测与阈值分割
Canny [1] Canny Edge Detection. https://docs.opencv.org/3.4/da/d22/tutorial_py_canny.html [2] OpenCV Edge Detection ( cv2.Canny ). https://pyimagesearch.com/2021/05/12/opencv-edge-detection-cv2-canny/ 由John F. Canny提出 1、由于边缘检测容易受噪声影响&…...
QQ空间无敌装逼,复制下面的任一代码粘贴即可出现意想不到的图案。
复制下面的任一代码粘贴即可出现意想不到的图案。 打赏代码: [em]e10033[/em]{uin:123,nick: 打赏了你一个冰淇淋,who:1} [em]e10033[/em] 打赏了100000000000.00元红包 [em]e10011[/em] 赞代码:{uin:0000,nick: xx、xx、xx、xx、xx、xx、xx、xx、xx、xx、xx、x…...
必看!总结5种JavaScript异步解决方案
1.回调 回调简单地理解为一个函数作为参数传递给另一个函数,回调是早期最常用的异步解决方案之一。 回调不一定是异步的,也不直接相关。 举个简单的例子: function f1(cb) {setTimeout(() > {cb && cb();}, 2000); }f1(() >…...
JUC并发编程高级篇第四章之ThreadLocal(人手一份,天下安)
文章目录1、ThreadLocal的简介1.1、常见的面试题(也是本次的讲解的内容)1.2、什么是ThreadLocal1.3、ThreadLocal的所用1.4、没有出现ThreadLocal前后的变化1.5、ThreadLocal代码示例1.6、阿里巴巴对ThreadLocal的使用要求1.7、ThreadLocal的源码分析2、ThreadLocal…...
dump 定位分析
在缺少pdb的时候如何分析dump? windbgidaWindbg定位崩溃位置 通过windbg打开dump,并且分析dump !analyze -v 分析: 分析dump: !analyze -v错误原因:读取空指针错误线程:00001e04,可通过命令…...
(十二)排序算法-插入排序
1 基本介绍 1.1 概述 插入排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。 插入排序的工作方式非常像人们排序一手扑克牌一样。开始时,我们的左手为空并且桌子上的牌面朝下。然后,…...
elasticsearch 认知
1.大数据领域需要解决以下三个问题 如何存储数据 传统的关系数据库(MySQL、Oracle、和Access等)主导了20世纪的数据存储模式,但当数据量达到太字节级,甚至拍字节级时,关系型数据库表现出了难以解决的瓶颈问题。为了解决…...
《人体地图》笔记
《人体地图》 坂井建雄 著 孙浩 译 腹部通向大腿的隧道 腹部与大腿的分界点是大腿根部,即是腹股沟。 腹壁肌肉连结在腹股沟韧带上,腹壁肌肉包括三层,分别为腹外斜肌、腹内斜肌和腹横肌,每块肌肉都有一个张开的小孔,…...
java基础集合面试题
什么是集合 集合就是一个放数据的容器,准确的说是放数据对象引用的容器 集合类存放的都是对象的引用,而不是对象的本身 集合类型主要有3种:set(集)、list(列表)和map(映射)。 集合的特点 集合的特点主要有如下两点&…...
Vue学习-Vue入门
Vue学习 一、Vue入门 1、 引入Vue Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库…...
【项目】bxg基于SaaS的餐掌柜项目实战(2023)
基于SaaS的餐掌柜项目实战 餐掌柜是一款基于SaaS思想打造的餐饮系统,采用分布式系统架构进行多服务研发,共包含4个子系统,分别为平台运营端、管家端(门店)、收银端、小程序端,为餐饮商家打造一站式餐饮服务…...
灌区流量监测设备-中小灌区节水改造
系统概述 灌区信息化管理系统主要对对灌区的水情、雨情、土壤墒情、气象等信息进行监测,对重点区域进行视频监控,同时对泵站、闸门进行远程控制,实现了信息的测量、统计、分析、控制、调度等功能。为灌区管理部门科学决策提供了依据…...
SpringBoot2核心功能 --- 指标监控
一、SpringBoot Actuator 1.1、简介 未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能。 <dependency><gro…...
python实战应用讲解-【numpy数组篇】常用函数(三)(附python示例代码)
目录 Python numpy.repeat() Python numpy.tile() Python numpy.asarray_chkfinite() Python numpy.asfarray() Python numpy.asfortranarray() Python numpy.repeat() Python numpy.repeat()函数重复数组中的元素 – arr. 语法 : numpy.repeat(arr, repetitions, axis …...
DIN论文翻译
摘要 在电子商务行业,利用丰富的历史行为数据更好地提取用户兴趣对于构建在线广告系统的点击率(CTR)预测模型至关重要。关于用户行为数据有两个关键观察结果:i) 多样性(diversity)。用户在访问电子商务网站时对不同种类的商品感兴趣。ii) 局部激活(local…...
python列表,元组和字典
1、python列表 1.1.列表的定义 list是一种有序的集合、基于 链表实现,name[ ] ,全局定义:list2list([ ])。 1.2下标索引 python不仅有负索引也有正索引。正索引从0开始,负索引从-1开始。这两个可以混用,但指向还是那个位置 a[0]a[-9]//length为10的数组a1.3列表的切片 列表可…...
300元左右的蓝牙耳机哪个好?300左右音质最好的蓝牙耳机
无线耳机是人们日常生活中必不可少的设备,无论是听音乐化石看电影都能获得身临其境的感觉,由于科技真在发展中,不断地的发生变化,百元价位就可以感受到不错的音色,下面小编整理了几款300左右音质表现不错的蓝牙耳机。 …...
AB Download Manager终极指南:告别杂乱下载,3步打造高效下载工作流
AB Download Manager终极指南:告别杂乱下载,3步打造高效下载工作流 【免费下载链接】ab-download-manager A Download Manager that speeds up your downloads 项目地址: https://gitcode.com/GitHub_Trending/ab/ab-download-manager 还在为下载…...
2.4 微积分与自动微分1
微积分 导数与微分 操作之前记得检查版本确保 matplotlib 正确安装:在d2l环境下输入pip install matplotlib (windows版) 重启jupyter就可以运行了(如果还是不行自行移步ai) 1.我们通过简单的微分方式得到我们需要的极限 2.之后我们再试着…...
LFM2.5-1.2B-Thinking-GGUF开源可部署:自主可控轻量模型替代方案深度评测
LFM2.5-1.2B-Thinking-GGUF开源可部署:自主可控轻量模型替代方案深度评测 1. 模型概述 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型,专为低资源环境优化设计。该模型采用GGUF格式存储,配合llama.cpp运行时,能…...
OpenClaw技能商店:基于nanobot开发并分享自定义模块
OpenClaw技能商店:基于nanobot开发并分享自定义模块 1. 为什么要开发OpenClaw技能 去年夏天,我发现自己每天要花大量时间处理重复性的文件整理工作——下载各种技术文档,按日期和项目分类存储,再手动生成目录索引。当我第三次在…...
【QT】Layout布局间隙优化全攻略(参数调整与实战技巧)
1. 为什么你的QT界面总有"迷之缝隙"? 每次用QT做界面开发时,最让我抓狂的就是那些莫名其妙出现的空白间隙。明明已经按照设计稿精确设置了控件尺寸,但运行起来总会出现几个像素的偏差。后来我发现,这些间隙主要来自三个…...
Python AI 用例工具部署踩坑实录:Docker镜像体积暴增300%、GPU显存泄漏、模型热加载失败的5个根因与秒级修复方案
第一章:Python AI 用例工具部署的典型失败图谱在真实生产环境中,Python AI 工具链(如 LangChain、LlamaIndex、FastAPI 封装的推理服务)的部署失败往往并非源于模型能力缺陷,而是由基础设施、依赖冲突与配置漂移引发的…...
CentOS 7下OnlyOffice离线部署全攻略:从依赖包下载到一键配置(避坑指南)
CentOS 7下OnlyOffice离线部署全攻略:从依赖包下载到一键配置(避坑指南) 在企业内网或安全隔离环境中部署文档协作平台时,OnlyOffice凭借其开源特性和丰富的编辑功能成为首选方案。本文将深入探讨如何在CentOS 7系统中实现完全离线…...
SDMatte在电商场景落地:商品主图自动去背景+透明PNG生成完整工作流
SDMatte在电商场景落地:商品主图自动去背景透明PNG生成完整工作流 1. 电商场景中的图像处理痛点 在电商运营中,商品主图的质量直接影响转化率。传统处理方式面临三大难题: 人工成本高:专业设计师处理一张图平均耗时15-30分钟边…...
GME-Qwen2-VL-2B效果实测:抽象文字如何匹配具体图片?
GME-Qwen2-VL-2B效果实测:抽象文字如何匹配具体图片? 1. 多模态搜索的突破性体验 想象一下,你脑海中浮现出一句富有哲理的句子:"人生不是裁决书",却想找一张能表达这种意境的图片。传统搜索引擎会怎么做&a…...
Python无GIL时代来了?揭秘CPython 3.13+无锁并发模型的8个高频面试陷阱
第一章:Python无GIL时代的技术演进与核心变革Python长期以来受全局解释器锁(GIL)制约,在多核CPU场景下难以实现真正的并行计算。随着CPython 3.13正式引入实验性“自由线程模式”(Free-threading Mode)&…...
