news 2026/4/15 13:52:44

**存储方式**:使用数组按层次遍历顺序(自上而下、自左至右)存放结点,适用于**完全二叉树**

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
**存储方式**:使用数组按层次遍历顺序(自上而下、自左至右)存放结点,适用于**完全二叉树**

一、二叉树的核心性质

  1. 满二叉树的结点数:深度为kkk的满二叉树,其结点总数为2k−12^k - 12k1。这是因为每一层的结点数为2i−12^{i-1}2i1(第iii层),从第 1 层到第kkk层求和即得:
    ∑i=1k2i−1=2k−1 \sum_{i=1}^{k} 2^{i-1} = 2^k - 1i=1k2i1=2k1

  2. 终端结点与度 2 结点的关系:在任意二叉树中,设终端结点(叶子)个数为n0n_0n0,度为 2 的结点个数为n2n_2n2,则有:
    n0=n2+1 n_0 = n_2 + 1n0=n2+1
    推导依据是总边数等于所有结点出度之和,也等于父结点指向孩子的边数。

  3. 完全二叉树的深度:含有nnn个结点的完全二叉树,其深度为:
    ⌊log⁡2n⌋+1 \lfloor \log_2 n \rfloor + 1log2n+1
    因为前k−1k-1k1层构成满二叉树结构,最多包含2k−1−12^{k-1}-12k11个结点。


二、二叉树的分类(结合图示)

类型定义说明
满二叉树深度为kkk且总节点数为2k−12^k - 12k1的二叉树,每一层都达到最大节点数量。例如:深度为 3 的满二叉树有 7 个结点。
完全二叉树深度为kkk,结点数为nnn,且这些结点对应于深度为kkk的满二叉树中编号为 1 到nnn的结点。特点是除最后一层外,其余层全满;最后一层结点连续靠左排列。
非完全二叉树不满足“最后一层结点从左到右连续”的条件,如某个内部结点缺少左孩子但存在右孩子,或下层结点中间出现空缺(如图 3-18© 中 6 号结点左侧无兄弟)。

三、二叉树的顺序存储结构

存储方式:使用数组按层次遍历顺序(自上而下、自左至右)存放结点,适用于完全二叉树,能高效利用空间并快速计算父子关系。

对于编号为iii的结点(1≤i≤n1 \leq i \leq n1in):

  • 双亲结点:若i>1i > 1i>1,其双亲编号为⌊i2⌋\left\lfloor \frac{i}{2} \right\rfloor2i;当i=1i = 1i=1时为根结点,无双亲。
  • 左孩子结点:若2i≤n2i \leq n2in,左孩子编号为2i2i2i;否则不存在左孩子。
  • 右孩子结点:若2i+1≤n2i+1 \leq n2i+1n,右孩子编号为2i+12i+12i+1;否则不存在右孩子。

注:该编号规则基于从 1 开始编号。若编程中使用从 0 开始的数组索引,则需调整公式为:

  • 父节点:⌊i−12⌋\left\lfloor \frac{i-1}{2} \right\rfloor2i1
  • 左孩子:2i+12i + 12i+1
  • 右孩子:2i+22i + 22i+2

要证明在任意二叉树中,叶子结点(终端结点)个数 $ n_0 $ 与度为 2 的结点个数 $ n_2 $ 满足关系:

n0=n2+1 n_0 = n_2 + 1n0=n2+1

我们可以通过结点总数边的总数两个角度进行推导。


证明过程

设一棵二叉树中有:

  • $ n_0 $:度为 0 的结点数(即叶子结点)
  • $ n_1 $:度为 1 的结点数(只有左孩子或右孩子)
  • $ n_2 $:度为 2 的结点数(有两个孩子)

则整棵树的总结点数为:

n=n0+n1+n2(1) n = n_0 + n_1 + n_2 \tag{1}n=n0+n1+n2(1)

另一方面,从边的数量来看:

  • 每个结点(除根结点外)都由一条边连接到其父结点。
  • 所以总的边数为:$ n - 1 $

而这些边也可以通过各结点的出度(孩子数)来计算:

  • 度为 1 的结点贡献 1 条边,
  • 度为 2 的结点贡献 2 条边,
  • 度为 0 的结点贡献 0 条边。

因此,总边数也可表示为:

边数=0⋅n0+1⋅n1+2⋅n2=n1+2n2 \text{边数} = 0 \cdot n_0 + 1 \cdot n_1 + 2 \cdot n_2 = n_1 + 2n_2边数=0n0+1n1+2n2=n1+2n2

又因为边数等于 $ n - 1 $,所以有:

n1+2n2=n−1(2) n_1 + 2n_2 = n - 1 \tag{2}n1+2n2=n1(2)

将式 (1) 中的 $ n = n_0 + n_1 + n_2 $ 代入式 (2):

n1+2n2=(n0+n1+n2)−1 n_1 + 2n_2 = (n_0 + n_1 + n_2) - 1n1+2n2=(n0+n1+n2)1

两边同时减去 $ n_1 $:

2n2=n0+n2−1 2n_2 = n_0 + n_2 - 12n2=n0+n21

移项得:

2n2−n2=n0−1⇒n2=n0−1 2n_2 - n_2 = n_0 - 1 \Rightarrow n_2 = n_0 - 12n2n2=n01n2=n01

即:

n0=n2+1 n_0 = n_2 + 1n0=n2+1

✅ 得证。


直观理解

这个性质的本质是:每一个新增的“分叉”(即度为 2 的结点)都会增加一个额外的分支路径,从而最终导致多出一个叶子。根结点开始是一个叶子(单节点树),每增加一个度为 2 的结点,相当于把一个叶子变成内部结点,并生成两个新叶子,净增一个叶子。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 18:46:19

YOLOv8镜像默认开启CPU频率高性能模式

YOLOv8镜像默认开启CPU频率高性能模式 在当前AI视觉应用快速落地的背景下,一个看似微小却影响深远的系统级设计——默认启用CPU高性能模式,正在悄然改变开发者使用深度学习工具的方式。尤其在基于YOLOv8构建的专用镜像中,这项优化不再是可选项…

作者头像 李华
网站建设 2026/4/13 12:30:29

数据科学家不愿公开的秘密:R语言随机森林分类优化技巧,速看!

第一章:数据科学家不愿公开的秘密:R语言随机森林分类优化技巧概览在实际建模过程中,许多数据科学家发现随机森林虽强大,但默认参数往往无法发挥其全部潜力。通过精细调参与特征工程配合,模型准确率可显著提升。以下是一…

作者头像 李华
网站建设 2026/4/6 4:36:24

JUnit 5 新特性详解与最佳实践

JUnit 5,作为Java生态系统中最主流的单元测试框架,自2017年发布以来,彻底改变了测试开发范式。相比JUnit 4,它引入了模块化架构、Lambda支持等创新,显著提升了测试的灵活性和可维护性。对于软件测试从业者而言&#xf…

作者头像 李华
网站建设 2026/4/8 14:12:17

还在用AI生搬硬套?这6款免费工具,知网维普查重无痕过!

别再让AI写作坑了你!这3个错误正在毁掉你的论文 还在用ChatGPT生搬硬套写论文? 还在为AI生成的内容重复率超标失眠? 还在被导师指着屏幕骂“这就是你所谓的原创?”? 如果你对以上任何一个问题点头,那么这…

作者头像 李华
网站建设 2026/4/12 21:27:03

企业级Axios封装实战指南

以下是一套企业级 Axios 封装方案,包含请求 / 响应拦截、统一错误处理、请求取消、环境区分、请求重试等核心功能,可直接集成到 Vue/React/ 纯前端项目中:一、封装目录结构src/ ├── utils/ │ ├── request.js # Axios 核心封装…

作者头像 李华