树与图的存储和遍历
存储
树是一种特殊的图,与图的存储方式相同.
对于无向图中的边ab,存储两条有向边a->b b->a
因此只考虑有向图的存储.
- 邻接矩阵 g[a][b] == 边a --> b
- 邻接表: 就是二维的单链表
int h[N],e[N],ne[N],idx;
// 添加一条边
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
// 初始化时
idx = 0;
memset(h, -1, sizeof h);
遍历
深度优先遍历
时间复杂度O(n + m)
int dfs(int u)
{
st[u] = true; // st[u] 标识u点已经被遍历
for(int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if(!st[j]) dfs(j);
}
}
宽度优先遍历
queue<int> q;
st[1] = true; // 标识1号点已经被标记
q.push(1);
while(q.size())
{
int t = q.front();
q.pop();
for(int i = h[t];i!=-1;i=ne[i])
{
int j = e[i];
if(!st[j])
{
st[j] = true;
q.push(j);
}
}
}