跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

树的结构定义与存储方式:vector 数组及链式前向星

综述由AI生成树作为非线性数据结构,具有递归定义特性。文章阐述了树的基本术语如度、高度及路径,区分了有序无序及有根无根树。重点讲解孩子表示法在树存储中的应用,对比了基于 vector 数组的动态存储与基于数组模拟链表的链式前向星实现。代码示例展示了如何在 C++ 中构建无向图形式的树结构,指出 vector 虽稍慢但通常足够使用,实际刷题可根据习惯选择。

草莓泡芙发布于 2026/3/30更新于 2026/6/215 浏览
树的结构定义与存储方式:vector 数组及链式前向星

一、树的概念

1.1 树的定义

树型结构是一类重要的非线性数据结构。

  • 有一个特殊的结点,称为根结点,根结点没有前驱结点。
  • 除根结点外,其余结点被分成 k 个互不相交的集合,其中每一个集合又是树,称这棵树为根节点的子树。
  • 结论:树是递归定义的

1.2 树的基本术语

  • 结点的度:树中一个结点孩子的个数称为该结点的度。
  • 树的度:树中结点最大的度数称为树的度。
  • 树的高度(深度):树中结点的最大层数称为树的高度 (深度)。
  • 路径:树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的,路径长度为序列中边的个数(且为最短路)。

1.3 有序树和无序树

  • 有序树:结点的子树按照从左往右的顺序排列,不能更改。
  • 无序树:结点的子树之间没有顺序,随意更改。

1.4 有根树和无根树

  • 有根树:树的根节点已知,是固定的。
  • 无根树:树的根节点未知,谁都可以是根结点。

注:这个认知主要会影响我们对于树的存储。在存储树结构的时候,最重要的就是要存下逻辑关系。如果是无根树,父子关系不明确,此时我们需要把所有的情况都存下来。如 a 和 b 之间有一条边,我们不仅要存 a 有一个孩子 b,也要存 b 有一个孩子 a。(有时有根树也需要这样存储)

二、树的存储

树结构相对线性结构来说就比较复杂。存储时,既要保存值域,也要保存结点与结点之间的关系。实际中树有很多种存储方式:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。现阶段,只要掌握孩子表示法,学会用孩子表示法存储树,并且在此基础上遍历整棵树。后续会在并查集中学习双亲表示法。至于其它存储形式,在学习算法阶段不要求掌握。

2.1 孩子表示法

孩子表示法是将每个结点的孩子信息存储下来。 如果是在无根树中,父子关系不明确,我们会将与该结点相连的所有点都存储下来。

2.2 实现方式

2.2.1 vector 数组实现

2.2.1.1 方法解析

vector 是可变长数组,如果只涉及尾插,效率还是可以的。而树结构这种一对多的关系,正好可以利用尾插,把所有的关系全部存起来。

  • 因此,可以创建一个大小为 n + 1 的 vector 数组 edges[n + 1]。
  • 其中 edges[i] 里面就保存着 i 号结点所连接的结点。
2.2.1.2 代码
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
vector<int> edges[N];

int main {
     n;
    cin >> n;
     ( i = ; i < n; i++) {
         a, b;
        cin >> a >> b;
        
        edges[a].(b);
        edges[b].(a);
    }
     ;
}
()
int
for
int
1
int
// a 和 b 之间有一条边
push_back
push_back
return
0

2.2.2 链式前向星

2.2.2.1 方法解析

链式前向星的本质就是用数组来模拟链表。 本质:其实就是把 b 头插到 a 所在的链表后面。

2.2.2.2 代码
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
// 链式前向星
int h[N], e[N * 2], ne[N * 2], id;
int n;

// 其实就是把 b 头插到 a 所在的链表后面执行一次头插操作
void add(int a, int b) {
    id++;
    e[id] = b;
    ne[id] = h[a];
    h[a] = id;
}

int main() {
    cin >> n;
    for (int i = 1; i < n; i++) {
        int a, b;
        cin >> a >> b;
        // a 和 b 之间有一条边
        add(a, b);
        add(b, a);
    }
    return 0;
}

2.2.3 两种方式的对比和总结

关于 vector 数组以及链式前向星:

  • 前者由于用到了容器 vector,实际运行起来相比较于后者更耗时,因为 vector 是动态实现的。
  • 但是在如今的算法学习与刷题中,一般不会无聊到卡这种常数时间。也就是 vector 虽然慢,但不会因此而超时。
  • 总结:做题的时候,选择一种自己喜欢的方式即可。

目录

  1. 一、树的概念
  2. 1.1 树的定义
  3. 1.2 树的基本术语
  4. 1.3 有序树和无序树
  5. 1.4 有根树和无根树
  6. 二、树的存储
  7. 2.1 孩子表示法
  8. 2.2 实现方式
  9. 2.2.1 vector 数组实现
  10. 2.2.1.1 方法解析
  11. 2.2.1.2 代码
  12. 2.2.2 链式前向星
  13. 2.2.2.1 方法解析
  14. 2.2.2.2 代码
  15. 2.2.3 两种方式的对比和总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 35 道常见前端 Vue 面试题详解
  • OpenClaw 部署与飞书机器人配置教程
  • 网络安全从零入门到专家的系统学习路线指南
  • 使用 OpenClaw 与飞书搭建服务器运维机器人
  • 通义万相 2.1 文生图模型特性与部署实践
  • SpringBoot 整合 LangChain4j 与 Tavily 实现联网搜索
  • LLaMA-Factory 实战指南:WebUI、量化与分布式训练
  • LangChain 实战:工具调用与结构化输出
  • Spring Boot 集成 MyBatis 操作数据库详解
  • XR 综合技术分享:三维实时渲染与 VR 全景视频的共生
  • VS Code 远程调用 Claude Agent 报错无效请求:参数配置错误修正
  • Whisper 语音识别教育场景:课堂录音自动转文字方案
  • ComfyUI v0.18.0:显存优化、VAE 架构进化、API 节点与前端升级
  • Linux 互斥锁详解:临界区保护与多线程协作
  • GitHub 访问加速:本地 hosts 配置与 DNS 刷新指南
  • AIStarter 一键安装 ComfyUI 黎黎原上咩 7.0 整合包教程
  • C++ 拷贝构造函数与赋值运算符重载详解
  • Vue2 纯前端对接海康威视摄像头实时视频预览
  • LangChain4j 并发处理与线程安全深度解析
  • OpenClaw iOS/Android 端部署教程:语音唤醒与随身 AI 助手

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online