以前准备保研笔试的时候曾经练习过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 }