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

树的模拟实现

一.链式前向星

所谓链式前向星,就是用链表的方式实现树。其中的链表是用数组模拟实现的链表。

首先我们需要创建一个足够大的数组h,作为所有结点的哨兵位。创建两个足够大的数组e和ne,一个作为数据域,一个作为指针域。创建一个变量id,标记新来结点存储的位置。

接下来是模拟实现,当x有一个孩子y的时候,就把y头插到x的链表中。

首先id++,e[id] = y,为y结点开辟一块位置存储;接着我们用 ne[id] = h[x] 通过指针的思想,在y的指针域内存储上x的信息,最后将h[x] = id,将y的信息给x,为其他元素提供指针域信息。2d17ae384be046bb8a1aef1ba20ad042.jpeg

例如我们要在4上存2,先id++将2存储到数组中,令e[id] = 2,接着我们将ne[id] = h[4],(先前的下标4中存储的是4),最后h[4] = id 存储指针域信息。那么这就相当于下标4中的h指向id = 5,e[5] 中存储的是结点2,2结点的指针域指向id = 4的下标,id = 4的下标中e[4] ,存储的是结点3。所以4结点就与2结点和3结点相连接。树就被模拟实现出来了。

下面是代码实现:

#include <iostream>
using namespace std;int n;
const int N = 10;
int e[2 * N], ne[2 * N], h[N];//因为每个点都包含自己和其他,所以需要开辟结点大约2倍的空间
int id;void add(int x, int y)
{id++;e[id] = y;ne[id] = h[x];h[x] = id;
}int main()
{cin >> n;for (int i = 1; i < n; i++)//n个元素n-1条边{int a, b; cin >> a >> b;add(a, b); add(b, a);//将每一个结点都单独分开计算,所以需要调用两次函数}return 0;
}

 二.顺序表实现树

我们的思想是,为每一个结点开辟一个数组,用map的思想,将数据的实际值与其下标进行对应减少复杂度,在对应的数组下标下存储其结点的值。

需要注意的是,此方法适合在算法竞赛中使用,使用的都是静态数组,需要人为的进行判断数组实际需要的大小。

接下来是代码实现:

#include <iostream>
#include <vector>
using namespace std;const int N = 1e5 + 10;
int n;
vector<int> edges[N]; // 存储树int main()
{cin >> n;for (int i = 1; i < n; i++){int a, b; cin >> a >> b;// a 和 b 之间有⼀条边edges[a].push_back(b);edges[b].push_back(a);}return 0;
}

总结:

无论是顺序表实现还是链表思想实现,他们都有优缺点。优点在于不需要频繁的进行动态空间的开辟能减少运行的时间,缺点在于需要人为的对数据量进行判断以及缺少一些灵活性。所以说,这两种方法只适合于算法竞赛中,而工程类当中是不合适的。

创作不易感谢大家支持!

 

http://www.lryc.cn/news/519574.html

相关文章:

  • AsyncOperation.allowSceneActivation导致异步加载卡死
  • 如何搭建 Vue.js 开源项目的 CI/CD 流水线
  • 单通道串口服务器(三格电子)
  • 【Excel/WPS】根据平均值,生成两列/多列指定范围的随机数/随机凑出两列数据
  • 使用网页版Jupyter Notebook和VScode打开.ipynb文件
  • 记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据
  • CDA数据分析师一级经典错题知识点总结(5)
  • 服务器、电脑和移动手机操作系统
  • 深入解析 Flink 与 Spark 的性能差异
  • 如何在 Linux、MacOS 以及 Windows 中打开控制面板
  • 微信小程序中 隐藏scroll-view 滚动条 网页中隐藏滚动条
  • Java 实现 Elasticsearch 查询当前索引全部数据
  • android刷机
  • 【25考研】西南交通大学计算机复试重点及经验分享!
  • OpenCV相机标定与3D重建(49)将视差图(disparity map)重投影到三维空间中函数reprojectImageTo3D()的使用
  • 学习HTTP Range
  • 大语言模型训练的数据集从哪里来?
  • Webpack和Vite的区别
  • 【再谈设计模式】模板方法模式 - 算法骨架的构建者
  • Bytebase 3.1.1 - 可定制的快捷访问首页
  • Java阶段四04
  • B2C API安全警示:爬虫之外,潜藏更大风险挑战
  • OCR文字识别—基于PP-OCR模型实现ONNX C++推理部署
  • 如何播放视频文件
  • MySQL -- 约束
  • php 使用simplexml_load_string转换xml数据格式失败
  • net-http-transport 引发的句柄数(协程)泄漏问题
  • 高级软件工程-复习
  • eslint.config.js和.eslintrc.js有什么区别
  • 如何使用MVC模式设计和实现校园自助点餐系统的微信小程序