一:广度优先搜索

思想:

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;

          }

   }

}

 

二:深度优先搜索算法:

思想:

搜索算法总结_子节点_02

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,结束