当前位置: 首页 > news >正文

考研数据结构之二叉树(一)(包含真题及解析)

考研数据结构之二叉树(一)

下期预告:后续文章将深入探讨二叉树的遍历算法与高频考点(如平衡二叉树、线索二叉树)。

二叉树是数据结构中的核心内容之一,也是考研高频考点。本文将从定义存储结构两方面展开,结合具体示例帮助读者建立系统的知识框架。


一、二叉树的定义

二叉树(Binary Tree) 是每个节点最多有两个子树的树形结构,子树分为左子树和右子树,其顺序不可颠倒。具体特点包括:

  1. 递归性:二叉树由一个根节点和两棵互不相交的左、右子树构成,子树本身也是二叉树。
  2. 节点限制:每个节点的度(子节点数量)不超过2,且子树有明确的左右之分。
  3. 特殊形态:二叉树可以是空树(节点数为0),或仅含根节点的单节点树。

示例

      A/ \B   C/ \D   E

该二叉树中,A为根节点,B为左子树根,C为右子树根,D和E是B的左右子节点。


二、二叉树的存储结构

二叉树的存储结构分为顺序存储链式存储两种,二者在实现方式和适用场景上有显著差异。

1. 顺序存储结构

使用一维数组按层序遍历顺序存储节点,通过数组下标隐式表达节点间的逻辑关系。

  • 存储规则
    • 根节点位于数组下标 0(或 1,视具体实现而定)。
    • 若某节点位于下标 i,其左子节点位于 2i+1(或 2i),右子节点位于 2i+2(或 2i+1)。
  • 适用场景
    适合完全二叉树(如堆结构),此时空间利用率高;但对非完全二叉树可能导致大量空间浪费。

示例

数组存储完全二叉树:
层序遍历顺序:A, B, C, D, E
数组索引:[A, B, C, D, E]

2. 链式存储结构

通过链表动态分配节点空间,每个节点包含数据域和两个指针域(左、右子节点指针)。

  • 节点定义(C语言示例):
    typedef struct BiTNode {int data;struct BiTNode *lchild, *rchild;
    } BiTNode, *BiTree;
    
  • 适用场景
    适合任意形态的二叉树,空间灵活性高,但需额外存储指针域。

示例

链式存储结构:
A节点的lchild指向B,rchild指向C;
B节点的lchild指向D,rchild指向E。

三、存储结构对比

特性顺序存储链式存储
空间效率非完全二叉树浪费空间灵活,无空间浪费
实现复杂度简单,直接通过数组操作需要管理指针,复杂度较高
适用场景完全二叉树、堆结构一般二叉树、动态变化的树结构

考研数据结构之二叉树(一):定义、存储结构与真题解析


四、真题解析

1. 选择题考点(完全二叉树节点数计算)

题目(改编自):

高度为h的完全二叉树最多和最少分别包含多少个节点?

解析

  • 最多节点数:当完全二叉树为满二叉树时,节点数为 2^h - 1
  • 最少节点数:当最后一层仅有一个节点时,节点数为 2^(h-1)
    答案:最多 2^h - 1,最少 2^(h-1)

2. 综合应用题(二叉树的数组存储与遍历)

题目(2022年真题,):

已知二叉树的数组存储结构如下(下标从1开始):
A B C D E # #
请写出其中序遍历序列。

解析

  • 数组存储规则:下标 i 的左子节点为 2i,右子节点为 2i+1
  • 还原二叉树
        A/ \B   C/ \
    D   E
    
  • 中序遍历:左子树 → 根 → 右子树,结果为 D B E A C
    答案D B E A C

3. 算法设计题(二叉树的繁茂度)

题目(严蔚敏题集,):

定义二叉树的繁茂度为各层节点数的最大值与树的高度的乘积。设计算法计算二叉树的繁茂度。

解析

  • 关键步骤
    1. 层次遍历统计每层节点数,记录最大值 maxWidth
    2. 计算树的高度 height
    3. 繁茂度 = maxWidth * height
  • 代码框架(C语言):
    int茂度(BiTree T) {if (!T) return 0;Queue Q;InitQueue(Q);EnQueue(Q, T);int maxWidth = 0, height = 0;while (!IsEmpty(Q)) {int levelSize = Q.size;maxWidth = max(maxWidth, levelSize);height++;for (int i = 0; i < levelSize; i++) {BiTree node = DeQueue(Q);if (node->lchild) EnQueue(Q, node->lchild);if (node->rchild) EnQueue(Q, node->rchild);}}return maxWidth * height;
    }
    

4. 还原二叉树(遍历序列应用)

题目(经典真题,):

已知二叉树的前序序列为 ABDCE,中序序列为 DBAEC,画出该二叉树并写出后序序列。

解析

  1. 前序A为根节点,左子树前序为 BD,右子树前序为 CE
  2. 中序A左侧为左子树 DB,右侧为右子树 EC
  3. 递归构建
        A/ \B   C/   /
    D   E
    
  4. 后序序列D B E C A

五、总结

通过真题解析可见:

  1. 定义类题目需熟悉完全二叉树、满二叉树的性质(如节点数计算)。
  2. 存储结构常结合遍历算法(如中序遍历)或数组/链表操作。
  3. 综合题需灵活运用遍历序列还原二叉树。

相关文章:

  • sql工具怎么选最适合自己的?
  • 【路由交换方向IE认证】BGP选路原则之Weight属性
  • 空间信息可视化——WebGIS前端实例(二)
  • Spark-SQL(一)
  • docker方式项目部署(安装容器组件+配置文件导入Nacos+dockerCompose文件创建管理多个容器+私有镜像仓库Harbor)
  • 循环神经网络 - 门控循环单元网络
  • LanDiff:赋能视频创作,语言与扩散模型的融合力量
  • 波束形成(BF)从算法仿真到工程源码实现-第八节-波束图
  • 【云平台监控】安装应用Ansible服务
  • 【Ansible自动化运维】六、ansible 实践案例与最佳实践:经验总结与分享
  • 未来七轴机器人会占据主流?深度解析具身智能方向当前六轴机器人和七轴机器人的区别,七轴力控机器人发展会加快吗?
  • AndroidStudio编译报错 Duplicate class kotlin
  • Uniapp: 修改启动时的端口号
  • 聊透多线程编程-线程池-9.C# 线程同步实现方式
  • Windows系统docker desktop安装(学习记录)
  • C++23 新特性:[[assume(expression)]] 属性
  • FileWriter 详细解析与记忆方法
  • 用 Deepseek 写的uniapp血型遗传查询工具
  • VRoid-Blender-Unity个人工作流笔记
  • 相机内外参
  • 长沙查处疑似非法代孕:有人企图跳窗,有女子被麻醉躺手术台
  • 库尔德工人党决定自行解散
  • 5月12日-14日,上海小升初民办初中进行网上报名
  • 人民日报整版聚焦:专家学者看2025中国经济增长点
  • 外交部:愿同拉美国家共同维护多边贸易体制
  • 乌外长:乌方准备无条件停火至少30天