一:广度优先搜索
思想:
1.在搜索树种任意选择一个节点A
2.从该节点出发访问他的所有子节点:B,C,D...
3.以B节点为根节点,访问它的所有子节点:T,N,M...
4.重复3步骤,直到所有节点被访问
解决方法:队列
利用队列存储未访问其子节点的节点,已经访问完其子节点的从队头出来,没有访问到期子节点的从队尾进来。
如上图a,假如选的V1为开始节点,则访问顺序依次为 V1-->V2-->V3-->V4-->V5-->V6-->V7
V1 进队,访问V1的子节点V2,V3 。
V2,V3进队,V1出队
V4,V4进队,V2出队
.....
知道V7出队,访问完所有节点。
广度优先搜索算法框架:
void BRF(){
Node *Q=NULL;
v1入队Q;
while(Q!=NULL){
取Q的头元素V1;
对V1的所有儿子节点V{
if(v是叶子节点) 计算最优值;
else{
if(v满足预设条件) v入队Q;
else 舍去v;
}
标记V1;
}
}
}
二:深度优先搜索算法:
思想:
1.任选一点作为根节点a
2.访问V1的从左向右的第一个子节点b
3.以b为节点重复1,2步骤
搜索过程:a-->b-->c-->f-->c-->d-->g
解决方法:栈
1.a进栈,b进栈,c进栈
2.c是叶子节点了,回溯,c出栈
3.搜索到b其他节f,f进栈,c进栈
4.c是叶子节点,c出栈,f出栈,b出栈
5.搜索到a的其他未访问的子节点d,d进栈,g进栈
6.g是叶子节点,出栈,d出栈,a出栈
7.栈为0,结束