Files
python/TangDou/DfsOrder/Base.cpp

69 lines
1.8 KiB
C++
Raw Normal View History

2025-08-30 18:35:01 +08:00
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
/*
1、一棵树的DFS序不唯一,因为深搜的时候选择哪个子节点的顺序是不一样的。
2、对于一棵树进行DFS序,需要把回溯的时候的节点编号也记录一下,这就是为什么每个数字在DFS序中会出现两遍的原因。
很容易发现的是,树的DFS序的长度是2N。
3、https://www.cnblogs.com/fusiwei/p/11758087.html
https://www.luogu.com.cn/blog/p6174/dfs-xu-ru-men
DFS序的一个性质就是把一棵子树放在一个区间里。
这个优秀的性质把树状结构变成了线性结构。方便我们进行统计。
刚刚提到的DFS序的性质让DFS序列成为了描述树的一种方式。准确地来说,
DFS序让我们把树状结构变成了一个线性的结构。我们只需要在这个线性结构上进行区间修改、
区间查询,而不需要再一遍遍地遍历整个子树来做到修改和查询。
*/
//邻接表
int idx, e[N], ne[N], h[N];
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int n;
int id[N];//id[] 数组就是DFS序的数组
int cnt; //cnt就是计时变量
/**
* 功能:输出dfs序
* @param u 当前结点
*/
void dfs(int u) {
id[++cnt] = u; //记录当前结点的dfs序号
for (int i = h[u]; i != -1; i = ne[i]) {//遍历当前结点的每一边条
int y = e[i];
dfs(y);
}
}
/*
9个结点8条边
测试用例
9
1 2
1 7
1 4
2 8
2 5
4 3
4 6
3 9
*/
int main() {
//邻接表初始化
memset(h, -1, sizeof(h));
cin >> n;
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
add(x, y);
}
dfs(1);
for (int i = 1; i <= cnt; i++)
printf("%d ", id[i]);
return 0;
}