树与图的存储和遍历
存储
树是一种特殊的图,与图的存储方式相同.
对于无向图中的边ab,存储两条有向边a->b b->a
因此只考虑有向图的存储.
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);}}
}
更多推荐
遍历
发布评论