数据结构——图

本文介绍了图数据结构的实现思路,包括创建顶点类、邻接表、Edge类以及迭代器Iterator。顶点类包含边的操作,如添加边、遍历节点。迭代器用于遍历邻接表。图类使用HashMap存储顶点,并提供了插入边、查找边等方法。最后,通过图的接口实现了深度优先遍历和广度优先遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感谢大牛关于图类的创建:https://www.cnblogs.com/hapjin/p/4760934.html.
思路大概是:
1.创建顶点类,每个顶点有自身标识(或value)
2.该顶点类中包含Edge类,以每个顶点对象为首,创建邻接表,表中元素为Edge对象,Edge类中包含终点节点以及边的权重;
3.顶点类中包含了对于顶点的操作,有添加边,遍历节点,该节点是否被访问,寻找未被访问的邻接点;当前节点的前继等操作;
4.遍历过程中使用了迭代器Iterator,其中创建Iterator<VertexInterface>类,该类中有可以访问Edge的Iterator,类中重新定义hasNext();next();函数;通过创建Iterator<VertexInterface>对象,便可得到遍历邻接表的迭代器;
5.通过迭代器查找边,插入边,寻找访问的邻接边等功能;
6.创建图类,定点类的对象在图类中用map<>容器存储;map使用hash表进行数据的存储;
7.图类中有返回顶点个数,边数,插入边,查找边,清空,初始化等功能;

通过创建图的接口,并用图类数据结构实现图的深度优先遍历(DFT)和广度优先遍历(BFT)
代码段如下:

	//深度优先遍历近似为树的前序遍历;
	/*
	 * 通过队列,堆栈辅助实现DFT(non-Javadoc)
	 * 将初始节点压入堆栈,标记为已访问,同时入队
	 * 访问栈顶节点,寻找栈顶节点相邻未访问节点,入栈,此时将站顶节点设为已访问,同时入队;
	 * 重复上一步,直至栈空;
	 * 返回队列,依次出队,即为深度优先遍历顺序;
	 * @see GraphInterface#getDepthFirstTraversal(java.lang.Object)
	 */
	public Queue<T> getDepthFirstTraversal(T origin) {
		// TODO Auto-generated method stub
		resetVertices();
		LinkedList<VertexInterface<T>> vertexStack=new LinkedList<>();//辅助DFS递归遍历
		Queue<T> traversalOrder=new LinkedList<>();//保存DFS遍历顺序
		
		VertexInterface<T> originVertex=vertices.get(origin);
		originVertex.Visite();//访问起始顶点
		
		vertexStack.push(originVertex);//顶点入栈顺序为DFS遍历顺序
		
		traversalOrder.offer(originVertex.getValue());//当顶点入栈时,保存在队列中
		
		while(!vertexStack.isEmpty())
		{
			VertexInterface<T> topVertex=vertexStack.peek();
			
			//找到栈顶节点未被访问的邻接点,从该邻接点接着去遍历邻接点
			
			VertexInterface<T> nextNeighbor=topVertex.getUnvisiteNeighbor();
			
			if(nextNeighbor!=null)
			{
				nextNeighbor.Visite();
				vertexStack.push(nextNeighbor);
				traversalOrder.offer(nextNeighbor.getValue());//每访问一个节点,将其入队列
			}
			else
			{
				vertexStack.pop();
			}
		}
		
		return traversalOrder;//队列出列顺序即为深度遍历顺序;
	}



	//广度优先遍历为树的层序遍历
	/*
	 * 使用两个辅助队列(non-Javadoc)
	 * 初始节点入队A,设定为已访问,初始节点入队B;
	 * 队A节点出队,设定迭代器,遍历访问该节点未访问邻接节点;依次入队A;队B;入队节点均设为已访问;
	 * 重复上一步,直至队A空;
	 * 返回队B,队中序列即为层序遍历:
	 * @see GraphInterface#getBreadFirstTraversal(java.lang.Object)
	 */
	@Override
	public Queue<T> getBreadFirstTraversal(T origin) {
		// TODO Auto-generated method stub
		resetVertices();
		LinkedList<VertexInterface<T>> vertexQueue=new LinkedList<>();//辅助队列
		
		LinkedList<T> valueQueue=new LinkedList<>();//BFT遍历顺序
		
		VertexInterface<T> OriginVertex=vertices.get(origin);
		
		OriginVertex.Visite();
		
		vertexQueue.offer(OriginVertex);
		valueQueue.offer(OriginVertex.getValue());
		
		
		while(!vertexQueue.isEmpty())
		{
			VertexInterface<T> frontVertex=vertexQueue.poll();
			Iterator<VertexInterface<T>> frontIterator=frontVertex.getNeighborVertex();
			while(frontIterator.hasNext())
			{
				VertexInterface<T> nextVertex=frontIterator.next();
				if(!nextVertex.Isvisited())//广度优先遍历优先访问未访问节点;
				{
					vertexQueue.offer(nextVertex);
					nextVertex.Visite();
					valueQueue.offer(nextVertex.getValue());
				}
			}
		}
		
		return valueQueue;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值