深度优先DFS和广度优先BFS的非递归实现

void DFS(Node root)   //非递归实现
{
    stack<Node> s;
    root.visited = true;
    printf("%d ", root.val);     //访问
    s.push(root);              //入栈
    while (!s.empty())
    {
        Node pre= s.top();          //取栈顶顶点
        int j;
        for (j = 0; j<pre.adjacent.size(); j++)  //访问与顶点i相邻的顶点
        {
            Node cur = pre.adjacent[j];
            if (cur.visited == false)
            {
                printf("%d ", cur.val);     //访问
                cur.visited = true;
                s.push(cur);           //访问完后入栈
                break;               //找到一个相邻未访问的顶点,访问之后则跳出循环
            }
        }
        //对于节点4,找完所有节点发现都已访问过或者没有临边,所以j此时=节点总数,然后把这个4给弹出来
        //直到弹出1,之前的深度搜索的值都已弹出,有半部分还没有遍历,开始遍历有半部分
        if (j == pre.adjacent.size())                   //如果与i相邻的顶点都被访问过,则将顶点i出栈
            s.pop();
    }
}
void BFS(Node root) {
    queue<Node> q;
    root.visited = true;
    printf("%d ", root.val);     //访问
    q.push(root);              //入栈
    while (!q.empty()) {
        Node pre = q.front();
        q.pop();
        for (Node cur : pre.adjacent) {
            if (cur.visited == false) {
                printf("%d ", cur.val);     //访问
                cur.visited = true;
                q.push(cur);
            }
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值