深搜和宽搜的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  }

 

你可能感兴趣的:(C++)