《数据结构风云》递归算法:二叉树遍历的精髓实现

《数据结构风云》递归算法:二叉树遍历的精髓实现


在这里插入图片描述

🔥@晨非辰Tong: 个人主页
👀专栏:《C语言》《数据结构与算法入门指南》
💪学习阶段:C语言、数据结构与算法初学者
⏳“人理解迭代,神理解递归。”


文章目录


引言

代码修行路上,你是否曾为盘根错节的二叉树所困?今日,我便传你一门无上法门——递归分神之术。
此法看似玄奥,实则暗合天道。面对复杂树结构,只需一剑化三清:本尊镇守当前,分神各巡左右。如此层层分化,直至洞悉所有脉络。
修得此术,任他树中有树、套中有套,你自能一眼洞穿虚实。三式法诀,助你练就火眼金睛,识破万千子树真伪。

》–获取源码–点我《


一、单值二叉树

965. 单值二叉树

1.目标特征描述:什么单值二叉树

在这里插入图片描述

2.目标实现示例:

在这里插入图片描述

3.算法思路:

先对简单二叉树进行算法推理,再推广到整体。

在这里插入图片描述
递归规则:先递进再返回。
递进:首先从根节点root开始,左子树如果存在先对左子树匹配判断:若二者数值不相等,就返回false,反之继续对右子树进行判断:二者数值不相等,返回false。当然,根节点为空返回true。推广到整体,就遍历左右子树判断。
返回:整个二叉树已经递进判断完毕,要对函数从最后开始返回:看图示,第2节点的左右子节点(&&的和关系)为空,那么都返回true,代表这个子树是单值的。右子树第3节点也是单值的。那么根节点的两个子树就都返回true&&的和关系),代表整体是单值二叉树。

3.1 具体代码实现

/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ bool isUnivalTree(structTreeNode* root){//首先判断树是否为空if(root ==NULL){return true;}//存在左子树再匹配if(root->left && root->val != root->left->val){return false;}if(root->right && root->val != root->right->val){return false;}returnisUnivalTree(root->left)&&isUnivalTree(root->right);}
  • 时间复杂度: O(N);
  • 空间复杂度: O(N);
在这里插入图片描述

二、相同的树

100. 相同的树

1.目标特征描述:什么是相同的树

在这里插入图片描述

2.目标实现示例

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

3.算法思路

在这里插入图片描述
情况分类两根节点情况结果
1两个根节点都为空是相同的树
2一个根节点为空,另一个不为空不是相同的树
3两个根节点都不为空比较节点数值进一步判断
--根据函数递归规则:
递进:从两个树根节点进行对比,第1种情况两个根节点都为空(代表没有子节点)就返回true;第2种情况一个根节点为空,另一个根节点不为空,两个树的结构不同,就返回false;第3种情况两个根节点都不为空,那么就要判断两个节点的数值,不相等就返回false。最后开始调用函数对比二者的左右子树。
返回:从函数的最后开始返回。看图示,从二者的第2个节点的左右子树开始对比,左右节点都为空返回true&&的和关系),代表两个二叉树的第2节点为根节点子树为相同的树。同理,二者的以第3个节点为根节点的子树也是相同的树。以此类推,根节点的左右子树都是相同的树(&&的关系),代表两个二叉树为相同的二叉树。

3.1 具体代码实现

/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ bool isSameTree(structTreeNode* p,structTreeNode* q){//两个根节点都为空-->结构相同if(p ==NULL&& q ==NULL){return true;}//只有一个根节点为空-->结构不同if(p ==NULL|| q ==NULL){return false;}//两个根节点都不为空,但值不相等if(p->val != q->val){return false;}//否则继续遍历判断子树returnisSameTree(p->left, q->left)&&isSameTree(p->right, q->right);}
在这里插入图片描述

三、另一棵树的子树

572. 另一棵树的子树

1.目标特征描述

在这里插入图片描述

2.目标实现示例

在这里插入图片描述

3.算法思路

基本算法:首先,如果根节点为空,就不需要与目标树再进行对比。不为空,就利用前面实现的判断是否是相同的树接口进行判断。不匹配,就调用函数遍历子树(注意:当左子树匹配成功,就不需要再对右子树进行判断 )。

3.1 具体代码实现

/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */typedefstructTreeNode TreeNode; bool isSametree(TreeNode* p, TreeNode* q){//第1种情况,两个书都为空if(p ==NULL&& q ==NULL){return true;}//第2种情况,其中1个根节点为空if(p ==NULL|| q ==NULL){return false;}//第3种情况,2个根节点存在,但是数值不相同if(p->val != q->val){return false;}//数值相同,向下进行调用函数判断子树returnisSametree(p->left, q->left)&&isSametree(p->right, q->right);} bool isSubtree(structTreeNode* root,structTreeNode* subRoot){if(root ==NULL){return false;}//调用判断最开始时根节点是否匹配if(isSametree(root, subRoot)){return true;}//根节点不匹配,向下递归调用returnisSubtree(root->left, subRoot)||isSubtree(root->right,subRoot);}
在这里插入图片描述

四、对称二叉树

101. 对称二叉树

1.目标特征描述

在这里插入图片描述

2.目标实现示例

3.算法思路

首先根节点为空,代表树为空,一定是对称的。不为空,将根节点的左右子树判断结构是否对称——>改变一下前面实现相同的树的接口:return isSametree(p->left, q->right) && isSametree(p->right, q->left);,因为让左右对应进行对比。
如果函数判断后,返回的false,那么就直接返回false

3.1 具体代码实现

/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */typedefstructTreeNode TreeNode; bool isSametree(TreeNode* p, TreeNode*q){//根节点都为空if(p ==NULL&& q ==NULL){return true;}//一个根节点为空if(p ==NULL|| q ==NULL){return false;}//不为空,但是数值不同if(p->val != q->val){return false;}//以上均不满足,代表这两个节点相同,遍历子树继续判断returnisSametree(p->left, q->right)&&isSametree(p->right, q->left);} bool isSymmetric(structTreeNode* root){//树为空if(root ==NULL){return true;}//树不为空,将左右子树进行对比,看结构是否对称if(isSametree(root->left, root->right)){return true;}return false;}

总结

道阻且长,行则将至
四大递归心法已传授完毕,但这只是算法修真的起点。递归分神的精髓,将在后续的图论、动态规划等秘境中继续发挥威力。
保持这份求道之心,我们下期「回溯秘境」再会!
愿每一位码农修行者,都能在算法之道上突破自我。

Read more

Neo4j-Desktop2.0安装教程(更改安装路径)

Neo4j-Desktop2.0安装教程(更改安装路径)

引言        由于neo4j-desktop2.0版本是不提供安装页面(默认安装在C盘),从而让你选择安装路径的,这对于C盘内存来说是灾难性的。因此,需要手动设置安装路径。 参考文献: 1. https://zhuanlan.zhihu.com/p/1935104156433121644https://zhuanlan.zhihu.com/p/1935104156433121644 2. https://blog.ZEEKLOG.net/WMXJY/article/details/150649084 安装包下载:https://neo4j.com/deployment-center/?desktop-gdbhttps://neo4j.com/deployment-center/?desktop-gdb 1文件夹创建及环境变量设置     首先需要在C盘以外的位置先创建一个Neo4j2文件夹,再在下面创建两个文件夹:App,PROData来存放软件本体和相关数据 然后打开“高级系统设置”——“环境变量”——系统变量下方的“新建”

基于Git-RSCLIP的Python爬虫数据增强:遥感图像自动标注方案

基于Git-RSCLIP的Python爬虫数据增强:遥感图像自动标注方案 1. 遥感图像标注的现实困境 做遥感图像分析的朋友可能都经历过这样的场景:项目刚启动,团队就卡在了数据准备环节。一张卫星图或航拍图,要人工框出农田边界、标注建筑类型、识别水体范围,往往需要专业地理信息人员花上几小时甚至几天。更让人头疼的是,不同区域的地物特征差异很大——城市里的高楼和乡村的梯田,需要完全不同的标注逻辑,而标注标准又得反复校准。 这种依赖人工的方式,在实际业务中很快就会遇到瓶颈。我们曾参与过一个省级农业监测项目,初期需要标注5000张高分二号影像,三名GIS工程师连续工作三周才完成第一批数据。但当模型训练效果不理想需要补充样本时,团队发现:不是没时间继续标注,而是标注质量开始下降——疲劳导致的误标率上升了近40%。更现实的问题是成本,按市场行情,专业遥感图像标注单价在80-150元/张,一个中等规模项目的数据标注预算轻松突破百万。 传统解决方案要么是购买商业标注平台服务,要么是组建专职标注团队。但前者灵活性差,后者人力成本高企。有没有一种方式,能让标注工作从“全人工”转向“人机协同”,把专

GitHub爆火的7个Claude Skills开源AI项目:Anthropic官方Skill 元技能+Superpowers 27k星任务拆解+Code Review自动审查+上下文优化(附开源链接

GitHub爆火的7个Claude Skills开源AI项目:Anthropic官方Skill 元技能+Superpowers 27k星任务拆解+Code Review自动审查+上下文优化(附开源链接

GitHub爆火的7个Claude Skills开源AI项目:Anthropic官方Skill Creator元技能+Superpowers 27k星任务拆解+Code Review自动审查+Context Engineering上下文优化(附安全避坑指南与开源链接) 一句话总结 Skills = Claude的"外挂系统"。 装上这7个开源项目,你的AI从"聊天机器人"秒变"专业打工仔"。 ⚠️ 先读安全警告:第三方Skills已有黑客攻击案例,务必优先使用官方/自制Skills。 文章目录 * GitHub爆火的7个Claude Skills开源AI项目:Anthropic官方Skill Creator元技能+Superpowers 27k星任务拆解+Code Review自动审查+Context Engineering上下文优化(附安全避坑指南与开源链接) * 一句话总结 * 7大工具速查表 * 详细说明 * 1️⃣ Skill Creator|官方元技能制造机 * 2️

Stable Yogi Leather-Dress-Collection开源可部署:SD1.5+Anything V5本地化部署全流程

Stable Yogi Leather-Dress-Collection开源可部署:SD1.5+Anything V5本地化部署全流程 想亲手打造一个能生成各种动漫风格皮衣穿搭的AI工具吗?今天,我们就来一步步部署一个名为“Stable Yogi Leather-Dress-Collection”的开源项目。它基于经典的Stable Diffusion 1.5模型和流行的Anything V5动漫风格模型,专门用来生成2.5D风格的皮衣穿搭图片。 这个工具最大的特点是“省心”。你不用再手动切换各种皮衣风格的模型文件,也不用费心去想复杂的提示词。它内置了智能管理功能,能自动识别你准备好的皮衣款式,并帮你生成匹配的绘图指令。更重要的是,它经过深度优化,对电脑显卡的要求比较友好,并且完全在本地运行,不需要联网,保护你的隐私。 无论你是想体验AI绘画的乐趣,还是想为角色设计寻找灵感,这个工具都是一个不错的起点。接下来,我将带你从零开始,完成整个环境的搭建和工具的启动。 1. 环境准备与项目部署 在开始生成酷炫的皮衣穿搭图之前,我们需要先把“画室”搭建好。这个过程主要分为两步:准备好