初学二叉树:从概念到递归,我的理解与思考
初学二叉树从概念到递归我的理解与思考刚学完普通二叉树的基础内容趁热整理一下自己的理解和学习思路既是复盘也希望能给同样入门的同学一点参考。一、我对二叉树的初印象从倒立的树说起最开始理解二叉树我总把它想象成一棵倒立的树—— 根在最上面向下分叉生长。和堆那种有固定规则的结构不一样普通二叉树的形态更灵活节点排布没有严格约束。和之前学的栈、队列相比最直观的区别就是栈和队列是线性结构二叉树是非线性结构。栈和队列底层都可以用数组轻松实现而二叉树天然更适合用链表来构造。线性结构里每个元素最多只有一个前驱和一个后继是一条线但二叉树里一个节点可以分出两个分支结构一下子就铺开了。二、核心概念梳理度、叶子节点与万能公式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/10/26 2:42:12 阅读更多 →
Shell 脚本工程化黄金标准:模块化、错误捕获与 GitHub Actions CI 集成防坑指南

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

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

2026/10/26 3:24:58 阅读更多 →
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/10/22 10:49:34 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →