初学二叉树:从概念到递归,我的理解与思考

发布时间:2026/7/21 3:56:09
初学二叉树:从概念到递归,我的理解与思考 初学二叉树从概念到递归我的理解与思考刚学完普通二叉树的基础内容趁热整理一下自己的理解和学习思路既是复盘也希望能给同样入门的同学一点参考。一、我对二叉树的初印象从倒立的树说起最开始理解二叉树我总把它想象成一棵倒立的树—— 根在最上面向下分叉生长。和堆那种有固定规则的结构不一样普通二叉树的形态更灵活节点排布没有严格约束。和之前学的栈、队列相比最直观的区别就是栈和队列是线性结构二叉树是非线性结构。栈和队列底层都可以用数组轻松实现而二叉树天然更适合用链表来构造。线性结构里每个元素最多只有一个前驱和一个后继是一条线但二叉树里一个节点可以分出两个分支结构一下子就铺开了。二、核心概念梳理度、叶子节点与万能公式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. 递归的底层就是栈递归遍历写起来代码很短但刚开始总觉得很神奇。学明白之后发现它的底层本质就是系统的函数调用栈。每递归调用一次函数系统就会在栈里压入一个栈帧保存当前节点、局部变量和返回地址一直递归到叶子节点、函数执行结束栈帧再依次弹出回到上一层继续执行剩下的代码。整个「一路向下、再逐层返回」的过程完全符合栈「后进先出」的特性。非递归遍历我目前还没有深入研究只知道它本质就是我们自己手动建一个栈去模拟系统调用栈的过程。至于「什么情况不能用递归」我也还在思考 —— 目前只知道递归深度太大的时候会栈溢出比如一条很长的单链二叉树递归层数上万就会崩这时候就必须用非递归写法。另外还有一个小疑问层序遍历算不算递归遍历我自己觉得不算因为层序遍历是用队列实现的一层一层往下走实现过程中函数也没有调用自身应该属于迭代遍历的一种。六、学习中的疑问与反思二叉树的现实意义到底是什么它到底解决了哪些线性结构做不到的事情这个问题我目前还只有模糊的感觉没有特别清晰的答案也是我接下来想搞明白的地方。数组实现普通二叉树的具体方式以及它和链式实现各自的适用场景还需要补全。非递归遍历的写法、适用场景和优缺点是接下来的重点学习内容。不过可以确定的是把普通二叉树的结构、递归和遍历吃透后面学二叉搜索树、平衡树、堆这些内容基础就会扎实很多。七、给初学同学的一点小建议如果是刚接触二叉树我个人最大的感受是先培养对递归的感觉。二叉树的很多操作天然适合递归写法刚开始可能觉得绕但写多了、画多了递归展开图慢慢就会形成一种直觉遇到问题会下意识地想到「这个可以用递归拆成子问题」。不用一开始就死磕非递归先把递归的逻辑理解透很多东西会自然而然地通。以上就是我初学二叉树的全部心得后续学了新内容再继续补充