初学二叉树:从概念到递归,我的理解与思考
初学二叉树从概念到递归我的理解与思考刚学完普通二叉树的基础内容趁热整理一下自己的理解和学习思路既是复盘也希望能给同样入门的同学一点参考。一、我对二叉树的初印象从倒立的树说起最开始理解二叉树我总把它想象成一棵倒立的树—— 根在最上面向下分叉生长。和堆那种有固定规则的结构不一样普通二叉树的形态更灵活节点排布没有严格约束。和之前学的栈、队列相比最直观的区别就是栈和队列是线性结构二叉树是非线性结构。栈和队列底层都可以用数组轻松实现而二叉树天然更适合用链表来构造。线性结构里每个元素最多只有一个前驱和一个后继是一条线但二叉树里一个节点可以分出两个分支结构一下子就铺开了。二、核心概念梳理度、叶子节点与万能公式1. 什么是节点的度简单说节点的度就是它有几个孩子。在二叉树里节点的度只能是 0、1、2 三种度为 0没有孩子也就是叶子节点度为 1只有一个孩子单分支节点度为 2左右孩子都有双分支节点我自己记的时候就类比树枝一根枝条分到最末端、不再分叉的地方就是叶子分一个叉就是单分支分两个叉就是双分支。这里有个容易混淆的点叶子节点是「度为 0 的节点」不等于「最下面一层的所有节点」。严格来说只要没有孩子无论在哪一层都是叶子节点只不过最底层的节点天然都是叶子。2. 万能公式 n₀ n₂ 1 的推导这个公式是做计算题的核心我是通过边数守恒推导理解的从总节点数看整棵树的总边数 总节点数 - 1 n₀ n₁ n₂ - 1从节点分支看总边数 所有节点发出的分支数 2×n₂ 1×n₁ 0×n₀两边相等化简之后就能得到n₀ n₂ 1。做题的时候这个公式非常好用可以直接消掉一个未知数。再结合题目给出的附加条件比如完全二叉树中 n₁ 只能是 0 或 1再利用「节点数必须是整数」这个隐含条件通常就能排除一个错误结果快速选出答案。验证一棵二叉树是否存在也很简单 已知总节点数和度为 2 的节点数时先用公式算出 n₀再求出 n₁只要 n₁ ≥ 0 且符合对应二叉树的约束比如完全二叉树 n₁ 只能 0 或 1就是合法的。三、三种二叉树的区分这三个概念刚开始很容易搞混我自己总结了一句话普通二叉树怎么长都行没有任何约束满二叉树每一层都长满了所有节点度都是 2没有空缺完全二叉树除了最后一层上面所有层都是满的最后一层的节点必须从左到右依次排列中间不能有空缺完全二叉树「从左到右连续」这个规则很容易踩坑也是我刚开始反复确认的点 —— 哪怕最后一层节点少但只要右边缺、左边连续就是完全二叉树如果左边空了、右边还有节点那就不是。四、代码实现为什么优先用链式结构我最开始实现二叉树直接就选择了链式结构。原因很直观普通二叉树形态灵活如果用数组存很难快速定位一个节点的左右孩子遍历和操作都不方便。不过这也是我后续要补的一个点数组其实也可以实现二叉树尤其是完全二叉树和满二叉树用数组下标就能非常方便地计算父子节点关系。普通二叉树用数组会浪费很多空间但不是完全不能实现这个误区我后面会专门再理清楚。链式二叉树的节点结构体设计很清晰一个数据域加上两个指针分别指向左孩子和右孩子保存的是左右子树的首地址。c运行typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree;五、二叉树遍历递归的本质就是函数调用栈1. 前中后序记忆技巧三种遍历顺序我总结了一句口诀左右顺序永远不变根的位置决定前中后。前序根 → 左 → 右中序左 → 根 → 右后序左 → 右 → 根只要记住「根在哪就是什么序」基本不会记混。2. 递归的底层就是栈递归遍历写起来代码很短但刚开始总觉得很神奇。学明白之后发现它的底层本质就是系统的函数调用栈。每递归调用一次函数系统就会在栈里压入一个栈帧保存当前节点、局部变量和返回地址一直递归到叶子节点、函数执行结束栈帧再依次弹出回到上一层继续执行剩下的代码。整个「一路向下、再逐层返回」的过程完全符合栈「后进先出」的特性。非递归遍历我目前还没有深入研究只知道它本质就是我们自己手动建一个栈去模拟系统调用栈的过程。至于「什么情况不能用递归」我也还在思考 —— 目前只知道递归深度太大的时候会栈溢出比如一条很长的单链二叉树递归层数上万就会崩这时候就必须用非递归写法。另外还有一个小疑问层序遍历算不算递归遍历我自己觉得不算因为层序遍历是用队列实现的一层一层往下走实现过程中函数也没有调用自身应该属于迭代遍历的一种。六、学习中的疑问与反思二叉树的现实意义到底是什么它到底解决了哪些线性结构做不到的事情这个问题我目前还只有模糊的感觉没有特别清晰的答案也是我接下来想搞明白的地方。数组实现普通二叉树的具体方式以及它和链式实现各自的适用场景还需要补全。非递归遍历的写法、适用场景和优缺点是接下来的重点学习内容。不过可以确定的是把普通二叉树的结构、递归和遍历吃透后面学二叉搜索树、平衡树、堆这些内容基础就会扎实很多。七、给初学同学的一点小建议如果是刚接触二叉树我个人最大的感受是先培养对递归的感觉。二叉树的很多操作天然适合递归写法刚开始可能觉得绕但写多了、画多了递归展开图慢慢就会形成一种直觉遇到问题会下意识地想到「这个可以用递归拆成子问题」。不用一开始就死磕非递归先把递归的逻辑理解透很多东西会自然而然地通。以上就是我初学二叉树的全部心得后续学了新内容再继续补充

相关新闻

Windows系统文件dpnathlp.dll丢失找不到问题解决

Windows系统文件dpnathlp.dll丢失找不到问题解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

2026/7/25 0:24:11 阅读更多 →
Shell 脚本工程化黄金标准:模块化、错误捕获与 GitHub Actions CI 集成防坑指南

Shell 脚本工程化黄金标准:模块化、错误捕获与 GitHub Actions CI 集成防坑指南

写在前面:在云原生运维与 CI/CD 底座构建中,Shell 脚本绝非“临时胶水代码”,而是系统级自动化不可替代的底层语言。然而,无数团队一边用 Shell 驱动千万级事件流水线,一边却容忍满屏 set -x 日志夹杂明文密钥。本文将…

2026/7/24 1:16:48 阅读更多 →
3分钟掌握Pixelle-Video:AI全自动短视频创作终极指南

3分钟掌握Pixelle-Video:AI全自动短视频创作终极指南

3分钟掌握Pixelle-Video:AI全自动短视频创作终极指南 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video 想要快速制作专业短视频…

2026/7/24 10:12:19 阅读更多 →

最新新闻

ADS131A0x高精度ADC实战:从硬件设计到固件驱动的电能计量系统指南

ADS131A0x高精度ADC实战:从硬件设计到固件驱动的电能计量系统指南

1. 项目概述:从芯片手册到高精度数据采集实战如果你正在为电能计量、电网保护或者高精度多通道数据采集系统选型,那么德州仪器(TI)的ADS131A02和ADS131A04这两颗24位同步采样Δ-Σ ADC,大概率已经进入了你的视野。它们…

2026/7/25 0:23:46 阅读更多 →
为什么你的英文Prompt总被误读?揭秘中文提示词翻译中隐藏的4层语义损耗机制

为什么你的英文Prompt总被误读?揭秘中文提示词翻译中隐藏的4层语义损耗机制

更多请点击: https://codechina.net 第一章:为什么你的英文Prompt总被误读?揭秘中文提示词翻译中隐藏的4层语义损耗机制 当你将“Generate a concise, professional email summarizing the Q3 sales report with bullet points and a call-t…

2026/7/25 0:23:46 阅读更多 →
TPS2373 PoE PD控制器设计:从协议原理到硬件实现详解

TPS2373 PoE PD控制器设计:从协议原理到硬件实现详解

1. 项目概述:深入理解TPS2373在PoE系统中的核心角色 在部署网络设备,尤其是那些需要安装在难以触及位置的设备时,比如天花板上的无线接入点、建筑外墙的IP摄像头,或者工厂车间里的物联网传感器,最头疼的问题往往不是网…

2026/7/25 0:23:46 阅读更多 →
深入解析TMS320C6748 SPI时序:从原理到高速通信实战

深入解析TMS320C6748 SPI时序:从原理到高速通信实战

1. 项目概述:为什么需要深入理解SPI时序?在嵌入式开发领域,SPI(Serial Peripheral Interface)几乎是工程师的“必修课”。它简单、高效,一根时钟线、两根数据线就能实现全双工通信,驱动从Flash、…

2026/7/25 0:23:46 阅读更多 →
INA381电流检测芯片实战:高精度测量与400ns硬件过流保护设计

INA381电流检测芯片实战:高精度测量与400ns硬件过流保护设计

1. 项目概述:为什么我们需要一个“快准狠”的电流哨兵?在搞电源设计、电机驱动或者任何带功率输出的板子时,最怕什么?不是芯片发热,也不是程序跑飞,而是悄无声息的过流。你可能正调试得好好的,突…

2026/7/25 0:23:45 阅读更多 →
短剧翻译不想花大钱,效果能不能保证?实测给答案

短剧翻译不想花大钱,效果能不能保证?实测给答案

先说结论:花钱多少和效果好坏,在AI译制路线下不是强绑定关系。本文用具体的质量指标验证,"少花钱"是否等于"效果差",而不是简单给出一个"能"或"不能"的模糊回答。一、"花大钱效果好…

2026/7/25 0:22:44 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻