树与图的存储与遍历

树图的存储与遍历

树是特殊的图,是无环连通图,所以只需要看图的存储

图分为两种:有向图和无向图

无向图可以看为有向图,把所有无向边都存两个有向边即可

有向图的存储:

  1. 邻接矩阵,g[a][b]存储a->b n^2,适合存储稠密图

  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;
			}
		}
	}
}
posted @ 2022-08-18 10:56  张詠然  阅读(40)  评论(0)    收藏  举报