Concept of Tree

Storage and Traversal of Trees

和图的存储一致(建议用邻接表存储和链式前向星存储)

DFS遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5+5;

struct node
{
int nxt, to, cost;
node(){}
node(int x, int v, int c){ nxt = x, to = v, cost = c; }
}e[N<<1];

int Cnt = 0, head[N];
void Add_Edge(int u, int v, int c)
{
e[Cnt] = node(head[u], v, c);
head[u] = Cnt++;
}

int n, u, v, c, root, fa[N], dep[N], dis[N];
void dfs(int u, int f)
{
dep[u] = dep[f] + 1;
fa[u] = f;
for(int i = head[u]; ~i; i = e[i].nxt)
{
int v = e[i].to, c = e[i].cost;
if(v == f)continue;
dis[v] = dis[u] + c;
dfs(v, u);
}
}

int main()
{
cin>>n;
root = 1;
memset(head, -1, sizeof(head));
for(int i = 1; i<n; ++i)
{
cin>>u>>v>>c;
Add_Edge(u, v, c);
Add_Edge(v, u, c);
}
dfs(root, 0);
for(int i = 1; i<=n; ++i)
{
printf("%d : deep = %d, distance = %d, father = %d\n", i, dep[i], dis[i], fa[i]);
}
}

左右儿子记录法(二叉树)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5+5;

int root, n;

struct Node
{
int ls, rs;
Node(){ ls = 0, rs = 0; }
Node(int l, int r){ ls = l, rs = r; }
}a[N];

//二叉树遍历
void pre(int x) //先序遍历(根左右)
{
if(!x) return;
printf("%d ", x);
pre(a[x].ls);
pre(a[x].rs);
}
void mid(int x) //中序遍历(左根右)
{
if(!x) return;
mid(a[x].ls);
printf("%d ", x);
mid(a[x].rs);
}
void last(int x) //后序遍历(左右根)
{
if(!x) return;
last(a[x].ls);
last(a[x].rs);
printf("%d ", x);
}
int main()
{
cin>>n>>root;
for(int i = 1; i<=n; ++i) //左右儿子记录法
{
cin>>ls>>rs;
a[i] = Node(ls, rs);
}
}

Thanks to SZUACM