图的遍历-(深度优先&广度优先)

简介:

1.调用代码入口:

using System;

namespace 图_图的遍历
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var a = new AdjacencyList<char>();
            Console.WriteLine("1.初始化树结构:");
            Console.WriteLine("=================================");
            //添加顶点;
            a.AddVertex('A');
            a.AddVertex('B');
            a.AddVertex('C');
            a.AddVertex('D');
            a.AddVertex('E');
            a.AddVertex('F');
            a.AddVertex('G');
            a.AddVertex('H');
            //添加边;
            a.AddEdge('A', 'B');
            a.AddEdge('A', 'C');
            a.AddEdge('B', 'D');
            a.AddEdge('B', 'E');
            a.AddEdge('C', 'F');
            a.AddEdge('C', 'G');
            a.AddEdge('D', 'H');
            a.AddEdge('E', 'H');
            a.AddEdge('F', 'H');
            a.AddEdge('G', 'H');
            Console.WriteLine("=================================");
            Console.WriteLine("2.树的深度优先遍历:");
            new DepthFirstTraversal<char>(a.Items).Process();
            Console.WriteLine("=================================");
            Console.WriteLine("3.树的广度优先遍历:");
            new BreadthFirstTraversal<char>(a.Items).Process();

            Console.Read();
        }
    }
}

2.图-图节点类:

namespace 图_图的遍历
{
    /// <summary>
    ///     链表中的节点
    /// </summary>
    public class Node<T>
    {
        /// <summary>
        ///     邻接点域
        /// </summary>
        public Vertex<T> Adjvex;

        /// <summary>
        ///     下一个邻接点指针域
        /// </summary>
        public Node<T> Next;

        /// <summary>
        ///     链表中的节点
        /// </summary>
        /// <param name="value"></param>
        public Node(Vertex<T> value)
        {
            Adjvex = value;
        }
    }
}

3.图-图表头节点类:

using System;

namespace 图_图的遍历
{
    /// <summary>
    ///     链表中的表头节点
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class Vertex<T>
    {
        /// <summary>
        ///     数据
        /// </summary>
        public T Data;

        /// <summary>
        ///     邻接表表头指针
        /// </summary>
        public Node<T> FirstEdge;

        /// <summary>
        ///     访问标志,遍历时使用
        /// </summary>
        public Boolean Visited;

        /// <summary>
        ///     表头节点
        /// </summary>
        /// <param name="value"></param>
        public Vertex(T value) //构造方法;
        {
            Data = value;
        }
    }
}

4.深度优先遍历:

using System;
using System.Collections.Generic;

namespace 图_图的遍历
{
    /// <summary>
    ///     深度优先遍历
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class DepthFirstTraversal<T>
    {
        private readonly List<Vertex<T>> _items; //图的顶点集合;

        /// <summary>
        ///     深度优先遍历
        /// </summary>
        /// <param name="items"></param>
        public DepthFirstTraversal(List<Vertex<T>> items)
        {
            _items = items;
        }

        /// <summary>
        ///     遍历树
        /// </summary>
        public void Process()
        {
            InitVisted();
            DepthFirst(_items[0]);
            Console.WriteLine("");
        }

        /// <summary>
        ///     初始化节点访问状态
        /// </summary>
        private void InitVisted()
        {
            foreach (var vertex in _items)
            {
                vertex.Visited = false;
            }
        }

        /// <summary>
        ///     使用递归进行深度优先遍历
        /// </summary>
        /// <param name="vertex"></param>
        private void DepthFirst(Vertex<T> vertex)
        {
            vertex.Visited = true;
            Console.Write(vertex.Data + " ");
            Node<T> node = vertex.FirstEdge;
            while (node != null)
            {
                if (!node.Adjvex.Visited)
                {
                    DepthFirst(node.Adjvex); //递归访问节点;
                }
                node = node.Next;
            }
        }
    }
}
5.广度优先遍历:

using System;
using System.Collections.Generic;

namespace 图_图的遍历
{
    /// <summary>
    ///     广度优先遍历
    /// </summary>
    public class BreadthFirstTraversal<T>
    {
        private readonly List<Vertex<T>> _items; //图的顶点集合;

        public BreadthFirstTraversal(List<Vertex<T>> items)
        {
            _items = items;
        }

        /// <summary>
        ///     广度优先遍历
        /// </summary>
        public void Process()
        {
            InitVisted();
            BFS(_items[0]);
            Console.WriteLine("");
        }

        /// <summary>
        ///     初始化节点访问状态
        /// </summary>
        private void InitVisted()
        {
            foreach (var vertex in _items)
            {
                vertex.Visited = false;
            }
        }

        /// <summary>
        ///     使用队列进行广度优先遍历
        /// </summary>
        /// <param name="vertex"></param>
        private void BFS(Vertex<T> vertex)
        {
            var queue = new Queue<Vertex<T>>(); //创建一个队列;
            Console.Write(vertex.Data + " "); //访问节点;
            vertex.Visited = true;
            queue.Enqueue(vertex); //进队;
            while (queue.Count > 0) //只要队列不为空,就循环;相当于:一层一层的进行访问;
            {
                Vertex<T> w = queue.Dequeue();
                Node<T> node = w.FirstEdge;
                while (node != null)
                {
                    if (!node.Adjvex.Visited)
                    {
                        Console.Write(node.Adjvex.Data + " ");
                        node.Adjvex.Visited = true;
                        queue.Enqueue(node.Adjvex);
                    }
                    node = node.Next;
                }
            }
        }
    }
}

执行结果:


目录
相关文章
|
11月前
|
JSON 分布式计算 数据处理
加速数据处理与AI开发的利器:阿里云MaxFrame实验评测
随着数据量的爆炸式增长,传统数据分析方法逐渐显现出局限性。Python作为数据科学领域的主流语言,因其简洁易用和丰富的库支持备受青睐。阿里云推出的MaxFrame是一个专为Python开发者设计的分布式计算框架,旨在充分利用MaxCompute的强大能力,提供高效、灵活且易于使用的工具,应对大规模数据处理需求。MaxFrame不仅继承了Pandas等流行数据处理库的友好接口,还通过集成先进的分布式计算技术,显著提升了数据处理的速度和效率。
|
机器学习/深度学习 自动驾驶 算法
深度学习在图像识别中的应用与发展
本文将深入探讨深度学习技术在图像识别领域的应用,通过案例分析展示其最新进展。我们将从基本原理出发,了解深度学习如何改变图像处理和识别的方式,并展望其未来可能的发展方向。
|
11月前
|
数据采集 监控 数据挖掘
常用电商商品数据API接口(item get)概述,数据分析以及上货
电商商品数据API接口(item get)是电商平台上用于提供商品详细信息的接口。这些接口允许开发者或系统以编程方式获取商品的详细信息,包括但不限于商品的标题、价格、库存、图片、销量、规格参数、用户评价等。这些信息对于电商业务来说至关重要,是商品数据分析、价格监控、上货策略制定等工作的基础。
|
11月前
|
机器学习/深度学习 自然语言处理 语音技术
ChatTTS大模型在广播电视领域的应用实例
本文介绍了基于ChatTTS大模型的文字转语音工具,该工具结合现代文本处理和语音合成技术,提供高效的音频生成解决方案。文章详细描述了工具的主要功能,包括文本输入、语音选择、语速调整等,并探讨了其在广播电视行业的应用前景,如新闻播报、广告制作和教育培训等领域。未来,该工具将集成更多高级功能,以满足行业需求。
355 9
|
网络协议 算法 数据库
|
11月前
|
敏捷开发 人工智能 数据可视化
未来趋势:智能化需求管理的发展与挑战
在快速变化的商业环境中,有效需求管理对项目成功至关重要。本文从核心原则、策略、工具推荐及实践案例出发,深入探讨高效需求管理体系的构建,特别介绍了板栗看板的应用,为企业和个人提供有价值的参考。
|
人工智能 运维 安全
阿里云研发副总裁蔡德忠受邀参加乌镇峰会,畅谈AI与下一代互联网
2024年乌镇峰会“下一代互联网论坛”近日举办,主题为“创新驱动,安全赋能,共筑开放与安全的下一代互联网”。阿里云智能集团研发副总裁,基础设施网络研发负责人蔡德忠受邀参与圆桌讨论,并就人工智能(AI)与下一代互联网的融合发展分享了前瞻性见解。
|
机器学习/深度学习 人工智能 搜索推荐
AI在医疗领域的革命:智能诊断系统的未来
在科技日新月异的今天,人工智能(AI)技术正逐渐渗透到我们生活的每一个角落,其中医疗领域尤为显著。本文将探讨AI在医疗诊断中的应用及其带来的变革,重点介绍智能诊断系统的发展现状与未来趋势。通过深入浅出的方式,我们将揭示AI如何改变传统医疗模式,提高诊断效率和准确性,最终造福广大患者。
|
机器学习/深度学习 数据采集 人工智能
利用AI技术提升文本分类效率
【8月更文挑战第73天】在信息爆炸的时代,文本数据的快速增长使得文本分类成为数据处理的重要环节。本文将介绍如何利用AI技术提升文本分类的效率和准确性,包括数据预处理、模型选择与训练以及结果评估等关键环节。通过实际案例的代码示例,我们将展示如何实现一个高效的文本分类系统。
|
存储 人工智能 缓存
【AI系统】核心计算之矩阵乘
本文探讨了AI模型中矩阵乘运算的优化实现及其在AI芯片设计中的重要性。文章首先介绍了卷积操作如何转化为矩阵乘,接着阐述了矩阵乘的分块(Tiling)技术以适应芯片内存限制,最后总结了几种常见的矩阵乘优化方法,包括循环优化、分块矩阵乘法、SIMD指令优化等,旨在提高计算效率和性能。
512 0