在数据结构的学习中,二叉树是入门的核心重点,也是后续学习更复杂树形结构的基础。很多初学者刚接触二叉树时,会被“节点、度、遍历”等概念绕晕,其实只要抓住核心逻辑,循序渐进,就能轻松掌握。

一、先搞懂:什么是二叉树?

二叉树的定义非常简单,记住一句话就够了:每个节点最多有两个子节点,分别称为左子树和右子树,且左右子树有明确的顺序,不能随意交换。

这里要特别区分两个易混点,避免踩坑:

  • 二叉树 ≠ 深度为2的树:二叉树的深度可以是任意正整数(1、2、3...),深度为2只是二叉树的一种特例,不是全部。

  • 二叉树 ≠ 树的特殊情况:树的节点没有左右之分,且节点的最大度数没有限制;而二叉树的节点最大度数为2,且左右子树有序(比如“根+左子树”和“根+右子树”是两种不同的二叉树)。

补充:空二叉树(不含任何节点)也是二叉树的一种特殊形态,后续遍历、存储时都会涉及。

二、核心基础概念(必记,刷题不踩坑)

学习二叉树,先掌握这些核心概念,后续理解遍历、性质会更轻松,所有概念都结合通俗解释,不用死记硬背:

  • 节点:二叉树的基本单元,包含一个数据元素(比如数字、字符),以及指向左、右子树的指针(或引用)。

  • 节点的度:一个节点拥有的“直接孩子”的数量,二叉树中节点的度只能是0、1、2(最多两个孩子)。

    • 度为0:没有直接孩子,就是我们常说的“叶子节点”(终端节点);

    • 度为1:只有一个直接孩子(左或右);

    • 度为2:有两个直接孩子(左和右)。

  • 根节点:没有父节点的节点,一棵非空二叉树有且只有一个根节点(相当于树的“顶端”)。

  • 深度与高度(重点,易混):

    • 深度:从根节点开始数,根节点深度为1,往下每一层深度加1(比如根的孩子深度为2);

    • 高度:从当前节点往叶子节点数,叶子节点高度为1,往上每一层高度加1(比如叶子的父节点高度为2);

    • 树的高度 = 根节点的高度。

  • 子树:以某节点的左、右孩子为根,形成的新二叉树,称为该节点的左子树、右子树(子树也可以是空的)。

三、二叉树的5种基本形态

从逻辑上看,二叉树有5种基本形态,覆盖了所有可能的结构,记住这5种,就能理解所有二叉树的构成:

  1. 空二叉树:没有任何节点(特殊形态);

  2. 只有根节点:度为0,没有任何子树;

  3. 根节点 + 左子树:右子树为空;

  4. 根节点 + 右子树:左子树为空;

  5. 根节点 + 左子树 + 右子树:最完整的基础形态。

提示:我们平时练习、刷题中遇到的二叉树,都是这5种形态的组合和延伸。

四、常见的特殊二叉树(基础重点)

入门阶段,重点掌握3种特殊二叉树,它们有明确的结构规则,是后续刷题、理解性质的基础:

4.1 满二叉树

定义:除了叶子节点,每一个节点都有左、右两个子节点,且所有叶子节点都在同一层(最底层)。简单说,就是“每一层都长满了节点”,没有空缺。

核心公式(必记):若满二叉树的深度为h(根节点深度为1),则总节点数 = \(2^h - 1\)。

举例:深度为3的满二叉树,总节点数 = \(2^3 - 1 = 7\)(1个根节点 + 2个第二层节点 + 4个第三层节点)。

4.2 完全二叉树

定义:除了最后一层,其他每一层的节点数都达到最大值;最后一层的叶子节点,必须从左到右依次排布,不能出现“空缺”。

关键提醒:满二叉树是完全二叉树的特殊情况,但完全二叉树不一定是满二叉树(比如深度为3、总节点数为6的二叉树,最后一层有3个叶子节点且靠左排列,就是完全二叉树)。

核心优势:完全二叉树适合用数组(顺序)存储,节点下标有明确规律(根节点下标为0时),刷题时常用:

  • 节点i的父节点下标:\((i - 1) / 2\)(向下取整);

  • 节点i的左孩子下标:\(2i + 1\)(若下标小于总节点数,否则无左孩子);

  • 节点i的右孩子下标:\(2i + 2\)(若下标小于总节点数,否则无右孩子)。

4.3 二叉搜索树(BST,基础排序树)

定义:也称二叉排序树,核心作用是实现“排序+快速查找”,满足3条规则:

  • 左子树上所有节点的值,都小于根节点的值;

  • 右子树上所有节点的值,都大于根节点的值;

  • 左、右子树也都是二叉搜索树。

举例:根节点为5,左子树节点为3、2、4,右子树节点为7、6、8,就是一棵二叉搜索树(左小右大)。

优势:理想情况下,查找、插入、删除的效率都很高(时间复杂度为\(O(\log n)\)),是后续进阶树结构的基础。

五、二叉树的核心性质(必背公式,刷题提速)

入门阶段,掌握这5条核心性质,就能轻松解决大部分基础选择题、填空题,不用死记硬背,理解推导逻辑更易掌握:

  1. 非空二叉树中,第i层的节点总数不超过 \(2^{i-1}\)(i≥1)。比如第1层最多1个(\(2^0\)),第2层最多2个(\(2^1\)),第3层最多4个(\(2^2\))。

  2. 深度为h的二叉树,最多有 \(2^h - 1\) 个节点(满二叉树的情况),最少有h个节点(斜树,所有节点只有左或右子树)。

  3. 任意一棵二叉树,若叶子节点数为\(n_0\),度为2的节点数为\(n_2\),则 \(n_0 = n_2 + 1\)(最核心、最常考的性质)。

  4. 具有n个节点的完全二叉树,深度为 \(\lfloor \log_2 n \rfloor + 1\)(向下取整)。比如n=4,深度= \(\lfloor \log_2 4 \rfloor + 1 = 2 + 1 = 3\)。

  5. 给定n个节点,能构成的不同二叉树数量为第n个卡特兰数,公式为 \(C_n = \frac{1}{n+1}C_{2n}^n\)(比如n=4时,卡特兰数为14,对应14种不同形态的二叉树)。

补充:性质3的简单推导(易懂):树的总边数 = 总节点数 - 1,且总边数 = 所有节点的度数之和(度1节点贡献1条边,度2节点贡献2条边),代入化简即可得到 \(n_0 = n_2 + 1\)。

六、二叉树的存储结构(入门必学)

二叉树的存储主要有两种方式,入门阶段重点掌握链式存储(最常用),顺序存储了解即可:

6.1 链式存储(二叉链,重点)

最常用的存储方式,结构清晰,适配所有二叉树形态,每个节点存储“数据+左、右子树指针”,用代码(C语言)表示最直观:


// 二叉链的节点结构(入门必记)

struct TreeNode

{ int val; // 节点存储的数据(可替换为其他类型)

struct TreeNode* left; // 指向左子树的指针

struct TreeNode* right; // 指向右子树的指针

};

补充:还有一种“三叉链”(增加父节点指针),入门阶段暂时不用掌握,后续需要再深入即可。

6.2 顺序存储(数组存储,了解)

适合完全二叉树,利用数组下标对应节点的父子关系,无需存储指针,节省空间,但非完全二叉树会造成大量空间浪费。

举例:深度为3的完全二叉树,数组存储为 [A, B, C, D, E, F](A为根节点),对应结构:

提示:入门阶段,重点练习链式存储的使用,顺序存储了解下标规律即可。

遍历是二叉树最基础、最核心的操作,本质是将“非线性”的二叉树,转换为“线性”的序列(比如数字、字符序列),方便后续处理。入门阶段重点掌握两种遍历方式:深度优先遍历(DFS)和广度优先遍历(BFS),其中深度优先遍历又分为3种,均用递归实现(迭代后续再学)。

核心逻辑:优先沿着一条路径走到最深(直到叶子节点),再回溯,继续遍历下一条路径,简单说就是“一条路走到底,再回头”。

示例二叉树(固定结构,方便对比):

  • 中序遍历(口诀:左→根→右)

    • 步骤:先递归遍历左子树 → 访问根节点 → 递归遍历右子树;

    • 示例结果:D → B → A → C → E。


// 中序遍历(左→根→右)

void inOrder(struct TreeNode* root)

{ if (root == NULL)

return; // 递归终止条件:空节点直接返回(避免空指针报错)

inOrder(root->left); // 1. 遍历左子树 printf("%d ", root->val); // 2. 访问根节点(打印数据) inOrder(root->right); // 3. 遍历右子树

}

核心逻辑:也称层序遍历,优先访问当前层的所有节点,再访问下一层,简单说就是“一层一层往外扩”,像水波扩散一样。

  1. 出队一个节点,访问该节点;

示例结果(还是上面的二叉树):A → B → C → D → E。

八、初学者常见坑(避坑指南)

  • 忘记递归终止条件:遍历、构造二叉树时,必须先判断root == NULL,否则会空指针崩溃。

九、总结(入门收尾)

最后提醒:二叉树的学习离不开练习,多画树图、多写代码,慢慢就能形成逻辑感,加油!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐