news 2026/4/23 17:26:28

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

作者头像

张小明

前端开发工程师

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/23 12:25:02

激光雷达(Lidar)介绍

概述 激光雷达(LiDAR,Light Detection and Ranging),即激光探测和测距,又称光学雷达。 在自动驾驶领域,激光雷达的作用类似人的眼睛,通过发射和接收反射回来的激光束对周围环境进行实时扫描&am…

作者头像 李华
网站建设 2026/4/23 12:24:48

YOLOv8如何实现人脸口罩佩戴检测?

YOLOv8实现人脸口罩佩戴检测的完整实践路径 在医院走廊、地铁闸机口或学校门口,你是否注意到那些默默工作的摄像头正悄悄“看”着每个人有没有戴好口罩?这背后并非人工值守,而是由AI驱动的视觉系统在实时判断。随着公共卫生意识的常态化&…

作者头像 李华
网站建设 2026/4/23 12:25:40

如何用R语言将时间序列预测误差降低60%?答案在这3个方法

第一章:R语言时间序列预测误差优化概述在构建时间序列预测模型时,预测误差的大小直接影响模型的实用性和可靠性。R语言提供了丰富的工具和包(如forecast、tseries、smooth等),支持对ARIMA、ETS、季节性分解等经典方法进…

作者头像 李华
网站建设 2026/4/23 12:25:12

无需复杂配置!YOLOv8预装镜像让深度学习更简单

无需复杂配置!YOLOv8预装镜像让深度学习更简单 在智能摄像头自动识别行人、工厂流水线实时检测缺陷、无人机视觉导航等场景背后,目标检测技术正悄然改变着我们与世界交互的方式。而在这股浪潮中,YOLOv8 凭借其出色的推理速度和精度平衡&#…

作者头像 李华
网站建设 2026/4/23 15:31:48

YOLOv8实战教程:如何在GPU环境下快速部署目标检测模型

YOLOv8实战教程:如何在GPU环境下快速部署目标检测模型架构演进与现实挑战 在智能监控摄像头遍布街头巷尾的今天,一个核心问题始终困扰着开发者:如何让目标检测模型既快又准地跑起来? 尤其是在边缘设备资源受限、实时性要求极高的场…

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

YOLOv8训练教程:基于COCO8数据集的完整实践指南

YOLOv8训练实践:从零开始的高效目标检测之旅 在智能摄像头自动识别行人、无人机实时追踪移动物体、工业质检系统快速定位缺陷的今天,目标检测早已不再是实验室里的概念,而是深入到我们生活与生产中的关键技术。而在这背后,YOLO&am…

作者头像 李华