给定一棵 n 个节点的树,树的根节点固定为 1
。我们有两种方式表示树的结构:
u v
表示节点 u
和节点 v
之间存在一条边。father[i]
表示节点 i
的父节点。通过【图论的存储】图的存储,我们可以学会怎么把图存进邻接表且怎么遍历。树的存储和遍历其实是几乎差不多的。
第一种情况
对于树的边,我们是以无向边存储进去的,那么(例如树是从1到2的有向边,但是读入可能会读入2 1 这种边的关系),所以在遍历时我们要转换为有向的结构。即,当你从父节点访问某个子节点后,不应该回到父节点。为此,你需要在DFS的时候消除返祖边
具体实现上,你可以在dfs的时候额外加一个参数:father,当要访问的下一个节点 == father 时,不返祖递归。否则这样会进入DFS死循环
void DFS(int u,int father) {