深搜和宽搜的c++实现

      以前准备保研笔试的时候曾经练习过c语言实现这两种搜索,但是过去一段时间之后,遇到深搜和宽搜的实现,还是显得很是捉急啊!最近开始学习c++,发现c++实现下

的深搜和宽搜简明易懂啊!

     简单一句话!深搜用堆栈,宽搜用队列。这篇文章主要倾向于实现而不是这两种搜索的应用了。

     下面有两段代码,是从维基百科上找到的,个人感觉非常有可重用性。

     

深搜
 1  std::stack<node*> visited, unvisited;
 2 node* current;
 3 
 4 unvisited.push(root); //先把树的根指针
 5  
 6  while(!unvisited.empty()) //只有UNVISITED不空
 7  
 8  {
 9     current=(unvisited.top()); //当前应该访问的
10     unvisited.pop(); 
11  
12     if(current->right!=NULL) 
13     unvisited.push(current->right); // 把右边压入 因为右边的访问次序是在左边之后
14  
15     if(current->left!=NULL) 
16     unvisited.push(current->left);
17  
18     visited.push(current);
19  
20     cout<<current->self<<endl;
21    //这里是对current节点的操作,这里简单的为输出节点值
22  }
宽搜
 1 std::queue<node*> visited, unvisited; 
 2  node nodes[9];
 3  node* current;
 4  
 5  unvisited.push(&nodes[0]); //先把root放入unvisited queue
 6  
 7  while(!unvisited.empty()) //只有unvisited不空
 8  {
 9     current = (unvisited.front()); //目前應該檢驗的
10  
11     if(current -> left != NULL)
12        unvisited.push(current -> left); //把左邊放入queue中
13  
14     if(current -> right != NULL) //右边压入。因为QUEUE是一个先进先出的结构,所以即使后面再压其他东西,依然会先访问这个。
15        unvisited.push(current -> right);
16  
17     visited.push(current);
18  
19     cout << current -> self << endl;
20  
21     unvisited.pop();
22  }

 

posted @ 2012-10-12 22:04  明之道  阅读(5172)  评论(0编辑  收藏  举报