news 2026/5/14 12:40:50

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

作者头像

张小明

前端开发工程师

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/5/11 17:45:16

如何在24小时内掌握R语言空间自相关分析?这份速成清单必须收藏

第一章:R语言空间自相关分析的核心概念空间自相关分析是地理统计学中的关键方法,用于衡量空间位置上的观测值是否存在聚集性或分散模式。在R语言中,该分析依赖于空间数据结构与统计指标的结合,帮助研究者识别数据的空间依赖性。空…

作者头像 李华
网站建设 2026/5/8 13:01:11

BDD实践:Cucumber, SpecFlow, Behave 全面指南

BDD 的核心概念与价值 行为驱动开发(Behavior-Driven Development, BDD)是一种敏捷软件开发方法,源于测试驱动开发(TDD),但更强调业务需求与可执行规范的协作。它使用自然语言(如Gherkin语法&a…

作者头像 李华
网站建设 2026/5/8 17:41:43

lavaan不会用?这7个关键代码模板让你秒变R语言建模专家

第一章:lavaan与结构方程模型入门结构方程模型(Structural Equation Modeling, SEM)是一种强大的多变量统计分析方法,广泛应用于心理学、社会学、管理学等领域。它能够同时估计测量模型与结构模型,处理潜变量&#xff…

作者头像 李华
网站建设 2026/5/9 20:58:39

降AI率实操指南:论文如何有效去除AI味

一、为什么手动降重总翻车?学术党必知的3大痛点“明明查重率达标了,导师却说论文有AI味要求重写!”——这是不是你的真实写照?很多同学误以为同义词替换调整句式就能蒙混过关,结果陷入三大困局:❌ 痛点1&am…

作者头像 李华
网站建设 2026/5/3 17:45:19

Pytest:优雅高效的Python测试框架

测试框架的进化需求 在持续集成与DevOps深度落地的2025年,Python作为主流开发语言亟需更强大的测试工具支撑。传统unittest框架的冗长断言、复杂配置已难以满足敏捷开发需求。Pytest应运而生,以其零配置起步、插件生态丰富和语法简洁优雅三大特性&#…

作者头像 李华
网站建设 2026/5/14 4:44:07

YOLOv8模型部署到Jetson Nano的实践经验

YOLOv8模型部署到Jetson Nano的实践经验 在智能摄像头、巡检机器人和边缘AI设备日益普及的今天,如何让深度学习模型真正在“端侧”跑起来,成了许多开发者面临的核心挑战。尤其是当项目从云端推理转向本地化、低延迟的实时检测时,资源受限的嵌…

作者头像 李华