深度优先遍历,英⽂缩写为DFS, 全称是 Depth First Search, 是⼀种⽤于遍历或搜索树或图的算法,所谓深度优先,就是说每次都尝试向更深的节点⾛,也就是⼀条路⾛到⿊,当⼀条路⾛完⾛到不能再⾛的时候,那就回去,继续去找别的路

总结如下图

- 因此,DFS 其实就是利⽤树的递归定义,使⽤递归的形式进⾏遍历
如何实现这个深度优先遍历(伪代码)
函数名dfs,
传⼊根结点,进⼊函数体后,⽐如先访问根结点
A,
再找到⼀个没有遍历过的孩⼦
B,
以 B为根继续重复这个
dfs(
深度优先遍历)
void dfs(int u) 深度优先遍历u这棵树
{
u 就是我们当前访问的结点
找到⼀个没有遍历过的孩⼦v
dfs(v)
}
有⼀个问题,如果存储这个树的时候是按在⽆根树的形式来存,也就是说存储
B
的孩⼦
E
的时候也会存储F
⼜会存储
A,
此时在找并没有遍历过的孩⼦的时候,我不仅会访问到
E F,
还会找到
A,
这是不允许的,因此我们需要在这⾥做⼀个标记,当我们进⼊到某⼀个递归函数的时候,当前这个u
就是已经被我们访问过的点,此时我们要标记当前结点已经被访问过了,不然从B
开始去
dfs
的时候不仅会调⽤E和
F,还
会回头调⽤
A,
此时就产⽣了死递归。创建⼀个全局的
bool
类型的数组就可以解决问题
void dfs(int u) 深度优先遍历u 这棵树
{
标记当前结点已经遍历过了
u 就是我们当前访问的结点
找到⼀个没有遍历过的孩⼦v
dfs(v)
}