树的存储
树的父亲表示法
// data
string nodes[N];
int fa[N];
fa[0] = -1;
void add(int b, int a) {
fa[b] = a;
}
二叉树的儿子表示法
struct Node {
string data;
int lc; // 未使用指针
int rc; // 未使用指针
Node() { lc = rc = -1; }
};
Node nodes[N];
二叉树的数组表示法
// data
string nodes[N];
// ch[i][0]表示左儿子,ch[i][1]表示右儿子
int ch[N][2];
树与图的存储
树是一种特殊的图,与图的存储方式相同。
无向图也是一种特殊的有向图。对于无向图中的边 xy
,存储两条有向边 x->y
, y->x
。因此我们可以只考虑有向图的存储。
邻接矩阵(稠密图)
bool g[N][N];
void add(int x, int y) { g[x][y] = 1; }
邻接表(稀疏图)
#include <vector>
std::vector<int> g[N];
// 添加一条边x->y
void add(int x, int y) { g[x].push_back(y); }
树与图的遍历
深度优先遍历(邻接表)
void dfs(int i) {
st[i] = true; // 点i已经被遍历过
for (auto j : g[i])
if (!st[j]) dfs(j);
}
宽度优先遍历(邻接表)
void bfs(int i) {
queue<int> q;
q.push(i);
st[i] = true; // 点i已经被遍历过
while (!q.empty()) {
int t = q.front();
q.pop();
for (auto j : g[t])
if (!st[j]) {
q.push(j);
st[j] = true; // 点j已经被遍历过
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。