树与图的存储与遍历
树图的存储与遍历
树是特殊的图,是无环连通图,所以只需要看图的存储
图分为两种:有向图和无向图
无向图可以看为有向图,把所有无向边都存两个有向边即可
有向图的存储:
-
邻接矩阵,g[a][b]存储a->b n^2,适合存储稠密图
-
邻接表(n个单链表)(推荐)
使用邻接表存储
树与图的dfs和bfs与搜索算法相似
树的dfs代码实现:
#include <iostream> using namespace std; const int N = 100010, M = N * 2; // 因为是双向连通图 int n, m; int h[N], e[M], ne[M], idx; bool st[N]; void add(int a, int b) { e[idx] = b; ne[idx] = h[a]; h[a] = idx; idx ++ ; } void dfs(int u) { st[u] = true; for (int i = h[u]; i != -1; i = ne[i]) { if (!st[e[i]]) dfs(e[i]); } } int main() { memset (h, -1, sizeof h); return 0; }
树与图的bfs代码实现:
void bfs() { // bfs之前要memset(h, -1, sizeof h); memset(d, -1, sizeof d); q[0] = 1; d[1] = 0; int hh = 0, tt = 0; // 用队列来存当前可以往后遍历的点 while (hh <= tt) { int t = q[hh ++ ]; for (int i = h[t]; i != -1; i = ne[i]) { int j = e[i]; if (d[j] == -1) { d[j] = d[t] + 1; q[ ++ tt] = j; } } } }
本文作者:张詠然
本文链接:https://www.cnblogs.com/zyrddd/p/16597957.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验