树的深度优先遍历(c++)

深度优先遍历,英⽂缩写为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)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值