数据结构4-深度优先搜索和广度优先搜索

1.深度优先搜索

        深度优先搜索类似于树的先序遍历,是树的先序遍历的拓展。从起始点开始沿着一个能访问的相邻点一直搜索下去,直到这条路线的尽头,再返回到上一个分叉的顶点搜索另一条路线。这显然一个递归算法,我们可以使用递归或者栈来解决。


2.广度优先搜索

        广度优先搜索是从初始顶点开始搜索所有未访问的相邻顶点,然后分别从这些相邻点出发依次访问它们的相邻点。一般会使用队列来解决广度优先搜索。


3.算法代码

/*遍历*/
/// <summary>
/// 找到一个相邻却为访问过的定点
/// </summary>
/// <param name="v"></param>
/// <returns></returns>
private int GetAdjUnvisitedVertex(int v)
{
    for (int i = 0; i < numVert; i++)
    {
        if (adjmatrix[v, i] != 0 && !vertices[i].IsVisit)     //adjmatrix是邻接矩阵,vertices是存放定点的数组
        {
            return i;
        }
    }
    return -1;
}

/// <summary>
/// 深度优先算法
/// </summary>
public void DepthFirstSearch()
{
    for (int i = 0; i < numVert; i++)
    {
        if (!vertices[i].IsVisit)       //若为访问过
            DepthFirstRecursion(i);
    }
    //重置访问标识符
    for (int i = 0; i < numVert; i++)
    {
        vertices[i].IsVisit = false;
    }
    Console.WriteLine();
}

/// <summary>
/// 深度优先递归
/// </summary>
/// <param name="point"></param>
private void DepthFirstRecursion(int point)
{
    if (vertices[point].IsVisit == true) return;   //已经被访问过就返回
    vertices[point].IsVisit = true;                //修改访问标识符
    DisplayVert(point);                            //输出顶点信息
    int next = GetAdjUnvisitedVertex(point);       //获取一个相邻顶点
    while (next != -1)
    {
        DepthFirstRecursion(next);                 //递归访问下一个顶点
        next = GetAdjUnvisitedVertex(point);
    }
}

/// <summary>
/// 广度优先算法
/// </summary>
public void BreadthFirstSearch()
{
    for (int i = 0; i < numVert; i++)
    {
        if (!vertices[i].IsVisit)
        {
            BreadthFirst(i);
        }
    }

    //重置访问表示符
    for (int i = 0; i < numVert; i++)
    {
        vertices[i].IsVisit = false;
    }
    Console.WriteLine();
}

/// <summary>
/// 广度优先队列
/// </summary>
/// <param name="i"></param>
private void BreadthFirst(int i)
{
    Queue queue = new Queue();                      //用于存放定点的队列
    queue.Enqueue(i);                               //放入第一个顶点到队列中
    DisplayVert(i);                                 //显示顶点信息
    vertices[i].IsVisit = true;                     //修改访问标识符
    while (queue.Count > 0)                         //队列不为空则一直循环
    {
        int vert1 = (int)queue.Dequeue();           //从队列中取出顶点
        int vert2 = GetAdjUnvisitedVertex(vert1);   //寻找与vert1的相邻顶点
        //找到所有与vert1相邻的顶点并输出,并将所有找到的顶点输出且加入队列中
        while (vert2 != -1)
        {
            queue.Enqueue(vert2);
            DisplayVert(vert2);
            vertices[vert2].IsVisit = true;
            vert2 = GetAdjUnvisitedVertex(vert1);
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值