在上一篇文章中树以及树的遍历:宽度优先搜索BFS c++的代码实现-优快云博客,我们提到了广度优先搜索,即宽度优先搜索(BFS),具体的BFS的实现以及原理,大家可以看回上一篇文章。在本篇我们将会讲双向广搜。
适用场景:有确定的起点以及终点,并且能将从起点到终点的单向搜索,转换成分别从起点和终点出发的相遇问题,那么在这种情况下,如果单向的BFS会超时,那么可以优先考虑双向广搜,以此减少时间复杂度。
在上篇文章中我们也讲到BFS的实现,那么接下来我们对比一下BFS和双向广搜的代码,以及所搜索的节点的个数来比较。
在这由于需要,我们要将树的定义更改一下,具体如下:
typedef struct mytree{
int data;
bool flag=false;
struct mytree *father,*lson,*rson;
}mt;
或许有读者会问,为什么要加一个布尔的flag和*father。其实很简单,flag用来判断这个节点是否被搜索过,方便判断有没有相遇;而*father就是该节点的父节点。
至于树的初始化在这就省略了,具体的可以看上篇文章。
接下来就是双向广搜的实现过程了,代码如下: