个人理解广度优先搜索
扫描二维码
随时随地手机看文章
google 下维基,广度优先搜索,理解定义只要看哪个“广”字就都能明白,在图的遍历中,从根节点开始,沿着树的宽度遍历树的节点。可以这样通俗的理解,一个人去拜访你家的时候是先拜访长辈,按照级别一级一级的拜访下来。
废话不多说,直接敲代码(对于不懂的算法,直接敲代码,背起来,就不信会不懂)
1. C 语言实现
广度优先搜索算法:
void BFS(VLink G[], int v) { int w; VISIT(v); /*訪問頂點v*/ visited[v] = 1; /*頂點v對應的訪問標記置為1*/ ADDQ(Q,v); while(!EMPTYQ(Q)) { v = DELQ(Q); /*退出隊頭元素v*/ w = FIRSTADJ(G,v); /*求v的第1個鄰接點。無鄰接點則返回-1*/ while(w != -1) { if(visited[w] == 0) { VISIT(w); /*訪問頂點v*/ ADDQ(Q,w); /*當前被訪問的頂點w進隊*/ visited[w] = 1; /*頂點w對應的訪問標記置為1*/ } w = NEXTADJ(G,v); /*求v的下一個鄰接點。若無鄰接點則返回-1*/ } } }
对图G=(V,E)进行广度优先搜索的主算法如下。
void TRAVEL_BFS(VLink G[], int visited[], int n) { int i; for(i = 0; i < n; i ++) { visited[i] = 0; /* 標記數組賦初值(清零)*/ } for(i = 0; i < n; i ++) if(visited[i] == 0) BFS(G,i); }C++ 的实现[编辑]
定义一个结构体来表达一个节点的结构:
struct node { int self; //数据 node *left; //左节点 node *right; //右节点 };
那么,我们在搜索一个树的时候,从一个节点开始,能首先获取的是它的两个子节点。例如:
A B C
A是第一个访问的,然后顺序是B和C;然后再是B的子节点,C的子节点。那么我们怎么来保证这个顺序呢?
这里就应该用queue数据结构,因为queue采用先进先出( first-in-first-out )的顺序。
使用C++的STL函式库,下面的程序能帮助理解:
std::queuevisited, unvisited; node nodes[9]; node* current; unvisited.push(&nodes[0]); //先把root放入unvisited queue while(!unvisited.empty()) //只有unvisited不空 { current = (unvisited.front()); //目前應該檢驗的 if(current -> left != NULL) unvisited.push(current -> left); //把左邊放入queue中 if(current -> right != NULL) //右边压入。因为QUEUE是一个先进先出的结构,所以即使后面再压其他东西,依然会先访问这个。 unvisited.push(current -> right); visited.push(current); cout << current -> self << endl; unvisited.pop(); }
个人认为想要理解好广度优先算法的话,直接看 C++ 实现的代码,简单易懂。
关于广度优先搜索算法还有很多种方式的代码实现,比如堆栈实现,递归实现...但是把上面这两种实现方法记住,剩下的其实是换汤不换药。