面试题常见算法之图的广度优先搜索和深度优先搜索

27 篇文章 0 订阅

类似于二叉树的广度优先搜索和深度优先搜索,代码如下:

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);  
            }  
        }  
    }  
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值