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

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

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

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


一、二叉树的定义

二叉树(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. 综合题需灵活运用遍历序列还原二叉树。
(1)非递归定义 树(tree)是由n(n≥0)个结点组成的有限集合。n=0的树称为空树;n>0的树T: ① 有且仅有个结点n0,它没有前驱结点,只有后继结点。n0称作树的根(root)结点。 ② 除结点外n0 , 其余的每个结点都有且仅有个直接前驱结点;有零个或多个直接后继结点。 (2)递归定义 颗大树分成几个大的分枝,每个大分枝再分成几个小分枝,小分枝再分成更小的分枝,… ,每个分枝也都是颗树,由此我们可以给出树的递归定义。 树(tree)是由n(n≥0)个结点组成的有限集合。n=0的树称为空树;n>0的树T: ① 有且仅有个结点n0,它没有前驱结点,只有后继结点。n0称作树的根(root)结点。 ② 除根结点之外的其他结点分为m(m≥0)个互不相交的集合T0,T1,…,Tm-1,其中每个集合Ti(0≤i<m)本身又是棵树,称为根的子树(subtree)。 2、掌握树的各种术语: (1) 父母、孩子与兄弟结点 (2) 度 (3) 结点层次、树的高度 (4) 边、路径 (5) 无序树、有序树 (6) 森林 3、二叉树的定义 二叉树(binary tree)是由n(n≥0)个结点组成的有限集合,此集合或者为空,或者由个根结点加上两棵分别称为左、右子树的,互不相交的二叉树组成。 二叉树可以为空集,因此根可以有空的左子树或者右子树,亦或者左、右子树皆为空。 4、掌握二叉树的五个性质 5、二叉树的二叉链表存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老北京儿码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值