二叉树(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左右音质表现不错的蓝牙耳机。 …...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...