数据结构初阶-二叉树的应用
1.单值二叉树
题目链接:https://leetcode.cn/problems/univalued-binary-tree/description/
题目思路:我们把根结点与左孩子和右孩子进行比较,只有左右子树都是单值二叉树的时候才为单值二叉树。但是我们需要先返回的是false,最后再返回左子树&&右子树的结果。所以代码如下:
typedef struct TreeNode TreeNode;
bool isUnivalTree(struct TreeNode* root)
{if(root==NULL){//如果全为空的情况下,没有存储任何值也就是单值二叉树return true;}if(root->left && root->val != root->left->val){//当左孩子不存在时我们仍然返回的是true//root->left是判断是否左子树为空的return false;}if(root->right && root->val !=root->right->val){return false;}return isUnivalTree(root->left)&&isUnivalTree(root->right);
}
2.相同的树
题目链接:https://leetcode.cn/problems/same-tree/description/
题目思路:如果p、q一者为空另一者为非空,则为false,我们使用前序遍历的方法,最终返回p的左子树和q的左子树的返回值&&p的右子树和q的右子树的返回值。
typedef struct TreeNode TreeNode;
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{if(p==NULL && q==NULL){return true;}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);
}
我们主要是返回的是false,如果我们在第三个if条件下p->val==q->val return true;这样我们不确定之后的树中是否还是相同的情况,只有我们最终比较到两者都为空才行。
*3对称二叉树(扩展)
题目链接:https://leetcode.cn/problems/symmetric-tree/description/
题目思路:由于我们发现这个给出的函数只有一个参数,但是我们需要比较的是左子树的左结点和右子树的右结点的返回值&&左子树的右结点和右子树的左结点的返回值,所以我们需要另外一个函数来判断,思路要把单值二叉树和相同的树进行整合,最终能得到以下代码:
bool panduan(struct TreeNode* p,struct TreeNode*q){if(p==NULL && q==NULL){return true;}if(p==NULL || q==NULL){return false;}if(p->val==q->val){//只有相同的时候才能继续递归return panduan(p->left,q->right) && panduan(p->right,q->left);}return false;}
bool isSymmetric(struct TreeNode* root)
{if(root==NULL){return true;}return panduan(root,root);
}
4.另一棵树的子树
题目链接:https://leetcode.cn/problems/subtree-of-another-tree/description/
题目思路:我们把第二题的代码全部放入题目后,然后每次都调用这个函数,先递归左子树再递归右子树,并返回二者或的结果,代码如下:
typedef struct TreeNode TreeNode;
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{if(p==NULL && q==NULL){return true;}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);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{if(isSameTree(root,subRoot)){return true;}if(root==NULL){return false;}return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}
5.二叉树的前序遍历
题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/description/
题目思路:返回值为int*,我们需要返回数组,数组还必须手动malloc。我们需要先求出二叉树结点的个数,这个函数我们之前写过,就不需要讲解了;然后我们需要malloc结点个数的数据,最后前序遍历,最终代码如下:
typedef struct TreeNode TreeNode;//求二叉树结点个数int TreeSize(TreeNode* root){if(root==NULL){return 0;}return 1+TreeSize(root->left)+TreeSize(root->right);}//前序遍历void PreOrder(TreeNode* root,int* arr,int* pi){if(root==NULL){return ;}arr[(*pi)++]=root->val;PreOrder(root->left,arr,pi);PreOrder(root->right,arr,pi);}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{//我们需要自己求出结点个数*returnSize=TreeSize(root);int* arr=(int*)malloc(sizeof(int)*(*returnSize));int i=0;//我们需要不断递增下标,所以要传址操作PreOrder(root,arr,&i);return arr;
}
拓展练习,题目链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/description/
和https://leetcode.cn/problems/binary-tree-postorder-traversal/description/
6.二叉树的构建及遍历
该题目难度较难,所以有兴趣的可以去看
题目链接:https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef
题目思路:首先我们需要根据数组来创建二叉树,之前我们是手动来创建二叉树的,所以我们没有注意这个问题,这个题目就可以锻炼我们创建二叉树的技巧。如何根据数组来创建二叉树?只要不为#我们就创建这个结点,第一个不为#的就是根结点,所以我们需要一个创建结点的函数,之前我们写过,所以很简单,然后我们用传址操作来得到每一个结点,先进行根结点的创建,再是左孩子,最后右孩子,最终代码如下:
#include <stdio.h>
//定义结点
typedef struct BinaryTreeNode
{
char data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BTNode;
//创建结点
BTNode* buyNode(char ch)
{BTNode* node=(BTNode*)malloc(sizeof(BTNode));node->data=ch;node->left=node->right=NULL;return node;
}
//创建二叉树
BTNode* createTree(char* arr,int* pi)
{if(arr[*pi]=='#'){(*pi)++;return NULL;}BTNode* root=buyNode(arr[*pi]);++(*pi);root->left=createTree(arr,pi);root->right=createTree(arr,pi);return root;
}
//中序遍历
void InOrder(BTNode* root)
{
if(root==NULL)
{return;
}
InOrder(root->left);
printf("%c ",root->data);
InOrder(root->right);
}
int main()
{char arr[100];scanf("%s",arr);int i=0;BTNode* root=createTree(arr, &i);InOrder(root);return 0;
}
7.总结和下节预告
这些题目难度都还行,只要虚心学习,不断在自己思考的情况下,这些题目还是很容易的。喜欢的可以一键三连哦,下节将讲解:排序1 。
相关文章:
数据结构初阶-二叉树的应用
1.单值二叉树 题目链接:https://leetcode.cn/problems/univalued-binary-tree/description/ 题目思路:我们把根结点与左孩子和右孩子进行比较,只有左右子树都是单值二叉树的时候才为单值二叉树。但是我们需要先返回的是false,最…...
【赵渝强老师】在Docker中运行达梦数据库
Docker是一个客户端服务器(Client-Server)架构。Docker客户端和Docker守护进程交流,而Docker的守护进程是运作Docker的核心,起着非常重要的作用(如构建、运行和分发Docker容器等)。达梦官方提供了DM 8在Doc…...
掌握C#循环:for、while、break与continue详解及游戏案例
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
备份比赛数据【算法赛】
0备份比赛数据【算法赛】 - 蓝桥云课 问题描述 蓝桥杯大赛的组委会最近遇到了一个棘手的问题。他们有 N 台电脑需要备份比赛数据,每台电脑所需的备份时间分别为 A1,A2,…,AN 分钟。 备份必须按编号顺序依次进行,即先第 1 台,再第 2 …...
【算法笔记】图论基础(二):最短路、判环、二分图
目录 最短路松弛操作Dijkstra朴素Dijkstra时间复杂度算法过程例题 堆优化Dijkstra时间按复杂度算法过程例题 bellman-ford时间复杂度为什么dijkstra不能处理负权边?dijkstra的三个步骤:反例失效的原因 算法过程例题 spfa时间复杂度算法过程例题spfa求最短…...
【性能优化点滴】odygrd/quill 中一个简单的标记位作用--降低 IO 次数
在 StreamSink 类中,成员变量 _write_occurred 的作用是 跟踪自上次刷新(Flush)以来是否有写入操作发生,其核心目的是 优化 I/O 性能。以下是详细解析: _write_occurred 的作用 1. 避免不必要的刷新(Flush…...
Unity2022发布Webgl2微信小游戏部分真机黑屏
复现规律: Unity PlayerSetting中取消勾选ShowSplashScreen 分析: 在Unity中,Splash Screen(启动画面) 不仅是视觉上的加载动画,还承担了关键的引擎初始化、资源预加载和渲染环境准备等底层逻辑。禁用后导…...
TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“
原因: 初始化时处于内网环境下,Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复: vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题...
基于yolov11的中空圆柱形缺陷检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
【背景介绍】 中空圆柱形缺陷检测在多个领域具有深远意义。在石油、天然气及化工行业,缺陷检测可预防泄漏事故,避免火灾、爆炸及环境污染,保障人员与财产安全。建筑、桥梁及航空航天领域则依赖此技术确保中空圆柱形结构的稳定性,…...
Python爬虫-爬取AliExpress商品搜索词排名数据
前言 本文是该专栏的第49篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以AliExpress平台为例。基于Python爬虫,通过某个指定的“搜索关键词”,批量获取该“搜索关键词”的商品排名数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废…...
20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】
./buildroot/system/skeleton/etc/profile # some more ls aliases alias llls -alF alias lals -A alias lls -CF 20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】 2025/3/21 16:53 cd /etc/ echo "" >> # some more ls ali…...
Flink 自定义数据源:从理论到实践的全方位指南
目录 第一章:自定义数据源的基础概念 数据源是什么?它在 Flink 中扮演什么角色? Flink 的内置数据源:开箱即用的 “标配” 为什么需要自定义数据源?它的杀手锏在哪? 第二章:自定义数据源的实现之道 接口选择:从简单到高级,选对工具事半功倍 SourceFunction:入门…...
如何在 Java 中查找 PDF 页面大小(教程)
PDF 文件并未被 Java 直接支持。本教程将向您展示如何使用 JPedal Java PDF 库 以简单的步骤提取 PDF 文件的页面大小(高度和宽度)。页面大小可以以 厘米、英寸或像素 为单位获取。 为什么要使用第三方库处理 PDF 文件? PDF 文件是一种复杂…...
java版嘎嘎快充玉阳软件互联互通中电联云快充协议充电桩铁塔协议汽车单车一体充电系统源码uniapp
演示: 微信小程序:嘎嘎快充 http://server.s34.cn:1888/ 系统管理员 admin/123456 运营管理员 yyadmin/Yyadmin2024 运营商 operator/operator2024 系统特色: 多商户、汽车单车一体、互联互通、移动管理端(开发中) 另…...
使用Mastra.ai构建AI智能体:一次动手实践
Mastra框架提供了一种简洁高效的AI智能体构建方式。 本文将分享我使用Mastra.ai的实践经历。 我们将逐步完成环境搭建、探索框架核心功能,并构建一个能与工具交互的基础智能体。 过程中我会总结成功经验、遇到的问题以及收获的启示。 如果你对AI开发感兴趣,或正在寻找一个…...
Redis之大key问题
BigKey 常见面试题目 你会么? MoreKey 案例 大批量往redis里面插入2000W测试数据key Linux Bash下面执行,批量插入100W for((i1;i<100*10000;i)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;生成100W条redis批量设置kv的…...
Excel第41套全国人口普查
2. 导入网页中的表格:数据-现有链接-考生文件夹:网页-找到表格-点击→变为√-导入删除外部链接关系:数据-点击链接-选中连接-删除-确定(套用表格格式-也会是删除外部链接)数值缩小10000倍(除以10000即可&am…...
深度学习驱动的车牌识别:技术演进与未来挑战
一、引言 1.1 研究背景 在当今社会,智能交通系统的发展日益重要,而车牌识别作为其关键组成部分,发挥着至关重要的作用。车牌识别技术广泛应用于交通管理、停车场管理、安防监控等领域。在交通管理中,它可以用于车辆识别、交通违…...
PageHiOffice网页组件(WebOffice文档控件)开发集成技巧专题一
PageHiOffice网页组件作为最新一代的WebOffice文档控件,这是目前市场上唯一能做到在Chrome等最新版浏览器中实现内嵌网页运行的商用文档控件,是OA及ERP等系统处理各种文档的福音。从发布到完善已经超过3年,不管是功能性还是稳定性都已经有了长…...
A2 最佳学习方法
记录自己想法的最好理由是发现自己的想法,并将其组织成可传播的形式 (The best reason for recording what one thinks is to discover what one thinks and to organize it in transmittable form.) Prof Ackoff 经验之谈: 做培训或者写文章ÿ…...
从JVM底层揭开Java方法重载与重写的面纱:原理、区别与高频面试题突破
🌟引言:一场由方法调用引发的"血案" 2018年,某电商平台在"双十一"大促期间遭遇严重系统故障。 技术团队排查发现,问题根源竟是一个继承体系中的方法重写未被正确处理,导致订单金额计算出现指数级…...
线程控制与线程操作
目录 线程的创建 tid pthread_self() 线程的退出 pthread_join 传参问题和返回值问题 pthread_exit 线程取消 线程分离 我们来学习线程的控制与线程操作 线程的创建 我们之前在线程的概念中就讲过了,我们可以通过pthread_create来创建一个或者多个子线程…...
Spring相关API
1是相对路径 2 是绝对路径 3 在注解时使用...
【GoLang】调用llm时提示词prompt的介绍以及使用方式
介绍 提示词是一种与大模型交互的对话格式,它以 JSON 格式定义了一个消息列表(messages),包含了系统消息和用户消息。 我们向AI提问时,其实发给AI的都是提示词,别看我们只是简单输入了一句话,…...
[杂学笔记]锁为什么影响效率、I/O多路复用、三种I/O多路复用模型的区别、atomic原子操作类、MySQL的持久性是如何实现的
目录 1.锁为什么影响效率 2.I./O多路复用 3.三种I/O多路复用模型的区别 4.atomic原子操作类 介绍 常用函数 内存顺序含义 5.MySQL持久性的实现 1.锁为什么影响效率 线程阻塞与上下文切换:在多线程并发访问的场景下,只有一个线程能够进入临界区…...
AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤
前言 就像我们前面几课所述,本系列是一门体系化的教学,它不像网上很多个别存在的单篇博客走“吃快餐”模式,而是从扎实的基础来带领大家一步步迈向AI开发高手。所以我们的AI课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…...
Leetcode 刷题笔记 图论part05
卡码网 107 寻找存在的路径 初识并查集 并查集功能: 寻找根节点,函数: find(int u),也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合,函数: join(int u, int v),将两个节点连在同一个根节点上判断两…...
NSSRound(持续更新)
了解过PHP特性吗 这个题相当于是php特性大杂烩 先看源代码 <?php error_reporting(0); highlight_file(__FILE__); include("rce.php"); $checker_1 FALSE; $checker_2 FALSE; $checker_3 FALSE; $checker_4 FALSE; $num $_GET[num]; if (preg_match(&qu…...
Python虚拟环境:从入门到实战指南
目录 一、为什么需要Python虚拟环境? 二、如何创建Python虚拟环境? 1. 使用venv(Python 3.3内置) 2. 使用virtualenv(第三方工具) 3. 使用conda(适合数据科学项目) 三、虚拟环…...
Python实现小红书app版爬虫
简介:由于数据需求的日益增大,小红书网页版已经不能满足我们日常工作的需求,为此,小编特地开发了小红书手机版算法,方便大家获取更多的数据,提升工作效率。 手机版接口主要包括:搜素࿰…...
注册中心之Nacos相较Eureka的提升分析
1. 传统拉取模式的缺陷(如Eureka) 在类似Eureka的注册中心中,消费者需要定时(如每30秒)主动拉取服务列表(Pull模式)。如果此时某个服务突然宕机,消费者可能无法立即感知,…...
高数下---8.1平面与直线
目录 平面的确定 直线的确定 若要求某一直线或平面就根据要素来求。 例题 平面中的特殊情况 平面中的解题思路 直线的解题思路 平面的确定 两要素 一 一点 二 倾斜角 即法向量 点法式 可化为一般式 Ax By Cz D 0; (A,B,C) 即法向量; 改变D 即…...
【AI速读】30分钟搭建持续集成:用Jenkins拯救你的项目
每个开发者都踩过的坑 你有没有这样的经历?花了一周时间改代码,自信满满准备提交,结果合并同事的更新后,项目突然编译失败,测试跑不通。你焦头烂额地排查问题,老板还在催进度……但明明不是你的错! 这种“集成地狱”几乎每个团队都遇到过。传统的手动集成方式(比如每周…...
centos 9 编译安装 rtpengine (快方式)-使用 debian12 系统自带
1:更新系统包 dnf update 2:启用EPEL仓库(提供额外软件包) # 安装EPEL仓库 sudo dnf install epel-release -y# 检查EPEL仓库是否启用(输出应包含epel) dnf repolist# 启用CRB仓库 sudo dnf config-manager --set-e…...
Android第六次面试总结(okhttp篇)
OkHttp 是一个高效的 HTTP 客户端,它的工作流程包含多个步骤,从请求的创建、发送,到服务器响应的接收和处理,每个环节都有特定的逻辑和组件参与。以下是对 OkHttp 工作流程的详细说明: 1. 请求构建 在使用 OkHttp 发…...
ngx_http_escape_location_name
定义在 src\http\ngx_http.c static ngx_int_t ngx_http_escape_location_name(ngx_conf_t *cf, ngx_http_core_loc_conf_t *clcf) {u_char *p;size_t len;uintptr_t escape;escape 2 * ngx_escape_uri(NULL, clcf->name.data, clcf->name.len,NGX_ESCAPE_U…...
QT网络通信的接口与使用
文章目录 前言1.服务端实现流程1.1步骤 1:创建 QTcpServer 并监听端口1.2步骤 2:处理新连接请求1.3步骤 3:接收客户端数据1.4步骤 4:处理客户端断开 2.客户端实现流程2.1步骤 1:创建 QTcpSocket 并连接服务器2.2步骤 2…...
基于生成对抗网络(GAN)的图像超分辨率重建:技术与应用
图像超分辨率重建(Super-Resolution, SR)是计算机视觉领域的重要任务,旨在从低分辨率图像中恢复出高分辨率图像。这一技术在医学影像、卫星图像、视频增强等领域具有广泛的应用价值。传统的超分辨率方法依赖于插值或基于模型的重建,效果有限。近年来,生成对抗网络(GAN)通…...
【spring对bean Request和Session的管理流程】
在 Spring 框架中,除了常见的 单例(Singleton) 和 原型(Prototype) 作用域外,还支持 Request 和 Session 作用域。这两种作用域主要用于 Web 应用程序中,分别表示 Bean 的生命周期与 HTTP 请求或…...
FastGPT原理分析-数据集创建第二步:处理任务的执行
概述 文章《FastGPT原理分析-数据集创建第一步》已经分析了数据集创建的第一步:文件上传和预处理的实现逻辑。本文介绍文件上传后,数据处理任务的具体实现逻辑。 数据集创建总体实现步骤 从上文可知数据集创建总体上来说分为两大步骤: &a…...
AI重构SEO关键词优化路径
内容概要 人工智能技术的深度应用正在推动SEO优化进入全新阶段。传统关键词优化依赖人工经验与静态规则,存在效率瓶颈与策略滞后性缺陷。AI技术通过智能语义分析系统,能够穿透表层词汇限制,精准捕捉用户搜索意图的语义关联网络,结…...
VMWare Ubuntu 详细安装教程
VMWare Ubuntu 详细安装教程 一、下载安装VMware二、下载 Ubuntu 镜像文件三、安装 Ubuntu四、开启虚拟机 一、下载安装VMware 官网下载地址https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion知乎大佬的博客原文,含下载地址https://zhua…...
SystemVerilog 数据类型
1、内建数据类型 verilog有两种基本的数据类型:变量和线网,他们各自都可以有四种取值:0 1 z x; RTL代码使用 变量 来存放组合和时序值;变量可以是单bit或者是多bit的无符号数 reg [7:0] m, 32bit的有符号…...
C语言:扫雷
在编程的世界里,扫雷游戏是一个经典的实践项目。它不仅能帮助我们巩固编程知识,还能锻炼逻辑思维和解决问题的能力。今天,就让我们一起用 C 语言来实现这个有趣的游戏,并且通过图文并茂的方式,让每一步都清晰易懂 1. 游…...
特殊行车记录仪DAT视频丢失的恢复方法
行车记录仪是一种常见的车载记录仪,和常见的“小巧玲珑”的行车记录仪不同,一些特种车辆使用的记录仪的外观可以用“笨重”来形容。下边我们来看看特种车载行车记录仪删除文件后的恢复方法。 故障存储: 120GB存储设备/文件系统:exFAT /簇大小:128KB 故…...
_DISPATCHER_HEADER结构中的WaitListHead和_KWAIT_BLOCK的关系
第一部分: // // Wait block // // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntosp typedef struct _KWAIT_BLOCK { LIST_ENTRY WaitListEntry; struct _KTHREAD *RESTRICTED_POINTER Thread; PVOID Object; struct _KWAIT_BLOCK *R…...
智能汽车图像及视频处理方案,支持视频实时拍摄特效能力
在智能汽车日新月异的今天,美摄科技作为智能汽车图像及视频处理领域的先行者,凭借其卓越的技术实力和前瞻性的设计理念,为全球智能汽车制造商带来了一场视觉盛宴的革新。美摄科技推出智能汽车图像及视频处理方案,一个集高效性、智…...
Rust + 时序数据库 TDengine:打造高性能时序数据处理利器
引言:为什么选择 TDengine 与 Rust? TDengine 是一款专为物联网、车联网、工业互联网等时序数据场景优化设计的开源时序数据库,支持高并发写入、高效查询及流式计算,通过“一个数据采集点一张表”与“超级表”的概念显著提升性能…...
Android Audio基础(13)——audiomixer
在 Android 平台上,音频混合器 AudioMixer 主要用在 AudioFlinger 里,将多路音频源数据混音(包括混音、音量处理、重采样及处理声道等)。位于 framework 的音频处理模库 libaudioprocessing(frameworks/av/media/libau…...
vivo 湖仓架构的性能提升之旅
作者:郭小龙 vivo互联网 大数据高级研发工程师 导读:本文整理自 vivo互联网 大数据高级研发工程师 郭小龙 在 StarRocks 年度峰会上的分享,聚焦 vivo 大数据多维分析面临的挑战、StarRocks 落地方案及应用收益。 在 即席分析 场景,…...