1. 图的概念
图是一种重要的数据结构,用于表示节点(顶点)之间的关系。图由一组顶点和连接这些顶点的边组成。图可以是有向的(边有方向)或无向的(边没有方向),可以是加权的(边有权重)也可以是无权的。
- 顶点(Vertex):图中的基本单位,代表对象。
- 边(Edge):连接顶点的线,可以是有向边或无向边。
- 加权图(Weighted Graph):边上有权重(表示成本、距离等)。
- 无向图(Undirected Graph):边没有方向,表示双向关系。
- 有向图(Directed Graph):边有方向,表示单向关系。
2. 创建图的节点模型
cs
class GraphNode
{
public int Data { get; set; }
public List<GraphNode> Neighbors { get; set; }
public GraphNode(int data)
{
Data = data;
Neighbors = new List<GraphNode>();
}
}
3. 使用及遍历
cs
using System;
namespace DataStructure
{
class Program
{
static async Task Main(string[] args)
{
// 创建图的节点
GraphNode node1 = new GraphNode(1);
GraphNode node2 = new GraphNode(2);
GraphNode node3 = new GraphNode(3);
// 添加节点之间的边(无向图,所以相互添加)
node1.Neighbors.Add(node2);
node2.Neighbors.Add(node1);
node2.Neighbors.Add(node3);
node3.Neighbors.Add(node2);
// 广度优先搜索遍历图并输出节点值
Console.WriteLine("广度优先搜索遍历图:");
BFS(node1);
}
static void BFS(GraphNode startNode)
{
Queue<GraphNode> queue = new Queue<GraphNode>();
HashSet<GraphNode> visited = new HashSet<GraphNode>();
queue.Enqueue(startNode);
visited.Add(startNode);
while (queue.Count > 0)
{
GraphNode currentNode = queue.Dequeue();
Console.Write(currentNode.Data + " ");
foreach (GraphNode neighbor in currentNode.Neighbors)
{
if (!visited.Contains(neighbor))
{
queue.Enqueue(neighbor);
visited.Add(neighbor);
}
}
}
}
}
}
运行结果