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

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


在这里插入图片描述

🔥@晨非辰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

Python热度下滑、AI能取代搜索引擎?TIOBE最新榜单揭晓!

Python热度下滑、AI能取代搜索引擎?TIOBE最新榜单揭晓!

整理 | 屠敏 出品 | ZEEKLOG(ID:ZEEKLOGnews) 日前,TIOBE 发布了最新的 3 月编程语言榜单。整体来看,本月排名变化不算大,但榜单中仍然出现了一些值得关注的小波动。  AI 工具能帮大家秒懂最新编程语言趋势? 由于 2 月天数较少,3 月的榜单整体变化有限。借着这次发布,TIOBE CEO Paul Jansen 也回应了一个最近被频繁讨论的问题:为什么 TIOBE 指数仍然依赖搜索引擎统计结果?在大语言模型流行的今天,直接询问 AI 哪些编程语言最流行,是不是更简单? 对此,Jansen 的回答是否定的。 他解释称,TIOBE 指数本质上统计的是互联网上关于某种编程语言的网页数量。而大语言模型的训练数据同样来自这些网页内容,因此从信息来源来看,两者并没有本质区别。换句话说,LLM 的判断,本质上也是建立在这些网页数据之上的。 Python 活跃度仍在下降

By Ne0inhk
一天开13个会、一个Bug要修200天!前亚马逊L7爆料:这轮大裁员,AI只是“背锅侠”

一天开13个会、一个Bug要修200天!前亚马逊L7爆料:这轮大裁员,AI只是“背锅侠”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 过去一年,大型科技公司的裁员消息几乎从未停过。但当公司对外给出的理由越来越统一,“AI 让组织更高效”,也有越来越多内部员工开始提出另一种质疑:事情或许没那么简单。 最近,一段来自前亚马逊员工 Becky 的 YouTube 视频在开发者社区流传开来。她曾在亚马逊工作 7 年,其中 5 年担任 L7 级别的技术管理者,负责过团队年度规划(OP1)等核心管理工作——可去年,她主动离开了亚马逊。 就在最近,她的三位前同事接连被裁,其中两人还是 H-1B 签证员工,都背着房贷压力。其中一位同事忍不住给 Becky 发消息:“你去年离开的时候,是不是已经预料到会发生这些?” 对此,Becky 的回答很坦诚:她不知道具体什么时候会裁员,但她早就感觉情况不对劲了。 在她看来,这轮裁员被归因为

By Ne0inhk
用 10% GPU 跑通万亿参数 RL!马骁腾拆解万亿参数大模型的后训练实战

用 10% GPU 跑通万亿参数 RL!马骁腾拆解万亿参数大模型的后训练实战

整理 | 梦依丹 出品 | ZEEKLOG(ID:ZEEKLOGnews) 左手是提示词的工程化约束,右手是 Context Learning 的自我进化。 在 OpenAI 新发布的《Prompt guidance for GPT-5.4》中,反复提到了 Prompt Contracts(提示词合约)。要求开发者像编写代码一样,严谨地定义 Agent 的输入边界、输出格式与工具调用逻辑,进而换取 AI 行为的确定性。 但在现实操作中,谁又能日复一日地去维护那些冗长、脆弱的“提示词代码”? 真正的 Agent,不应只靠阅读 Context Engineering,更应该具备 Context Learning 的能力。 为此,在 4 月 17-18

By Ne0inhk
当OpenClaw引爆全网,谁来解决企业AI Agent的“落地焦虑”?

当OpenClaw引爆全网,谁来解决企业AI Agent的“落地焦虑”?

2026 年 3 月,开源 AI Agent 框架 OpenClaw 在 GitHub 上的星标突破28万,并一度超越 React,成为 GitHub 最受关注的软件项目之一。短时间内,开发者利用它构建了大量实验性应用:从全栈开发辅助,到自动化营销脚本,再到桌面操作自动化,AI Agent 的能力边界正在迅速被拓展。 这股热潮也带动了另一个趋势——本地部署与算力硬件需求的快速增长。越来越多开发者尝试在个人设备或企业服务器上运行 Agent 系统,以获得更高的控制权和数据安全性。 从表面上看,AI Agent 似乎正从“概念验证”走向更广泛的开发实践。但在企业环境中,情况却没有想象中乐观。当企业负责人开始追问—— “它能直接解决我的业务问题吗?” 很多演示级产品仍难以给出令人满意的答案。 如何让 Agent 真正融入企业既有系统、适配复杂业务流程,正成为大模型产业落地必须跨越的一道门槛。 与此同时,中国不同城市的产业结构差异明显:互联网、

By Ne0inhk