1、dfs(res,当前结构,当前候选热数据,当前目标值,当前搜索的层级)
2、BFS(Breadth first search)
对于树来说,BFS就是层次遍历
而图的BFS 与树的BFS 不同点在于,树有根节点,图没有,所以图的BFS 要任意选择某节点进行遍历。
如图,若选择A节点作为开始节点,与A直接相连的节点为B和C,则下一层遍历是B和C。
A B C D E F
注意,B 和C 调换顺序没关系,但是DE不能调换,因为要先展开节点B,与B相连的有点A、C 、D,AC 以及遍历,只剩D节点,所以必须先遍历D节点
所以通常BFS不止一种结果
通常BFS借助队列来实现,将A放入队列中,弹出A的同时将A的所有临界点B、C放入队列,再弹出B ,同时将B的所有临界点D(A、C已经遍历过,不再入队列)放入队列,弹出C ,同时将C 的邻接点E放入队列,最后再一次弹出队列中的值。
DFS(Depth first search)
一条路走到黑
A B D F E C
同样的,在每个节点的选择很多,所以BFS结果也不止一种
与BFS 不同的是,DFS借助栈来实现遍历
3、当边上出现权值时,如何计算最短距离
优先队列Priority Queue
回溯
回溯法都可以抽象为树结构
//回溯算法模板
void backtracking(参数){
if(终止条件) {
存放结果 ;
return;
}
for(选择:集合的元素集(树中节点孩子数量为集合大小)){
处理节点(结果集的来源);
//递归
backtracking(路径,选择列表);
回溯操作(撤销/弹出处理结果);
}
}