图的遍历(BFS,DFS)

本文介绍了在数据结构课程中用C++实现图的两种遍历方法——广度优先搜索(BFS)和深度优先搜索(DFS)。通过邻接矩阵和邻接表两种存储方式,实现了图的遍历。BFS利用队列进行,而DFS则采用递归方法。代码示例展示了如何构造和遍历图。
摘要由CSDN通过智能技术生成

前言:在数据结构课程中,用C++封装了一些经典的算法,所以特地开一个个人分类来记录这些算法,以便将来用到的时候能够使我回忆起来,或者当做模板使用(另一方面也将书本上的代码的一些错误改正过来,方便以后的同学参考)。

首先是第三章的图的作业,图有两种存储方法,一种是用邻接矩阵来存图(主要用于稠密图),另一种是用邻接表来存图(主要用于稀疏图)。两种存图的方式不同,但是可以通过重写虚函数,使两种方式对图的操作的函数都一样,这样就便于之后在图上的各种算法的实现(比如最小生成树,最短路,拓补排序)

这次作业是封装图的类型以及用BFS,DFS 来遍历图。BFS用队列来实现,DFS则用递归来实现。

下面是我这段代码的构造的图:




下面是代码


1、邻接矩阵实现:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<stack>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int INF = 0x7fffffff;
//边类型
template <class EdgeType>
class Edge
{
public:
    int start,endd;
    EdgeType weight;
    Edge():start(-1),endd(-1),weight(-1){}
    Edge(int s,int e,int w=-1):start(s),endd(e),weight(w){}
    bool operator < (const Edge<EdgeType> e) const {
        return this->weight > e.weight;
    }
};

//图的抽象数据类型
template <class EdgeType>
class Graph
{
public:
    int numv,nume;
    bool *mark;

    //构造函数
    Graph(int num):numv(num),nume(0) {
        mark = new bool[num+1];
        memset(mark,false,sizeof(mark));
    }

    //析构函数
    ~Graph() {
        delete []mark;
    }
    virtual Edge<EdgeType> FirstEdge(int vertex)=0;
    virtual Edge<EdgeType> NextEdge(Edge<EdgeType> edge)=0;
    virtual void addEdge(int s,int e,EdgeType w)=0;
//    virtual void deleEdge(int s,int e)=0;

    //判断该边是否为该图的边
    bool IsEdge(Edge<EdgeType> edge) {
        if(edge.weight == -1) {
            return false;
        }
        return true;
    }
};



//邻接矩阵类型
template<class EdgeType>
class MatGraph: public Graph<EdgeType>
{
private:
    int **matrix
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
Python中的二叉树遍历可以使用广度优先搜索(BFS)和深度优先搜索(DFS)两种方法BFS(广度优先搜索)是一种逐层遍历二叉树的方法。从根节点开始,按照层级顺序依次访问每个节点,先访问左子节点,再访问右子节点。具体实现可以使用队列来辅助实现。以下是BFS的实现方式: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def bfs(root): if not root: return [] queue = [root] result = [] while queue: node = queue.pop(0) result.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) return result ``` DFS(深度优先搜索)是一种先访问根节点,然后递归地访问左子树和右子树的方法DFS有三种常见的遍历方式:前序遍历、中序遍历和后序遍历。以下是DFS的实现方式: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def dfs_preorder(root): if not root: return [] result = [] result.append(root.val) result += dfs_preorder(root.left) result += dfs_preorder(root.right) return result def dfs_inorder(root): if not root: return [] result = [] result += dfs_inorder(root.left) result.append(root.val) result += dfs_inorder(root.right) return result def dfs_postorder(root): if not root: return [] result = [] result += dfs_postorder(root.left) result += dfs_postorder(root.right) result.append(root.val) return result ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值