DFS 待遍历的元素被多次访问

// DFS.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"  
#include "stack"  
#include "stdio.h"  
#include "iostream"  
#include "vector"  
  
using namespace std;  
vector<int> vec;  
vector<int> vec2;  
stack<int> s;  
  
void DFS(int i);  
void DFS2();  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    //DFS(0);  
    //vec[0] = 5;  
    for (int i = 0;i<5;i++)  
    {  
        vec.push_back(i+1);  
    }  
    DFS2();  
    system("pause");  
    return 0;  
}  
  
void DFS2()  
{  
    if (vec2.size() == 5)  
    {  
        for (int i = 0; i<vec2.size();i++)  
        {  
            printf("%4d", vec2[i]);  
        }  
        printf("\n");  
    }  
    else  
    {  
        for (int i=0;i<vec.size();i++)  
        {  
            int t = vec[i];  
            s.push(t);  
            vec2.push_back(t);  
            //vec.erase(vec.begin()+i);  
            DFS2();  
            s.pop();  
            vec2.pop_back();  
            //vec.insert(vec.begin()+i,t);  
        }  
    }  
}  




元素处理,在上面的代码中被注释掉了,也就是说,每个元素在遍历的时候可以被多次遍历到。这样就会输出 1 1 1 1 1 或者 5 5 5 5 5 这样的结果。

之所以会出现这样的结果,是因为,在每次深度优先遍历的时候,递归调用函数的时候,  i 总是为0, 这样,就会出现5次递归调用,都是1入栈,然后到达递归调用的返回条件,输出 1 1 1 1 1, 返回到上一层调用后,i 变为 1, 这样2入栈,就会再次达到递归结束条件,输出 1 1 1 1 2. 

直到递归调用五次,到 1 1 1 1 5 后,递归返回倒数第3层,这个时候 栈中元素为1 1 1, 这个时候i 更新为1,这样2入栈, 栈中元素变为 1 1 1 2, 然后重新进行深度优先递归遍历。


到最后, i 为4, 5入栈,每一层的递归调用 i  都为5,最后输出 5 5 5 5 5


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值