题目要求:

1.对于下图所示的有向图(访问顺序按序号从小到大),试写出:

(1) 从顶点①出发进行深度优先搜索所得到的深度优先生成树;

(2) 从顶点②出发进行广度优先搜索所得到的广度优先生成树。

package com.test.tree;
import java.util.*;public class Graph {// 存储节点信息private Object[] vertices;// 存储边的信息private int[][] arcs;private int vexnum;// 记录第i个节点是否被访问过private boolean[] visited;/*** @param args*/public static void main(String[] args) {Graph g = new Graph(5);Character[] vertices = { '1', '2', '3', '4', '5'};g.addVertex(vertices);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(1, 3);g.addEdge(1, 4);g.addEdge(2, 3);g.addEdge(3, 4);g.addEdge(4, 0);System.out.println("深度优先遍历:");g.depthTraverse();System.out.println();System.out.println("广度优先遍历:");g.broadTraverse2(1);System.out.println();}public Graph(int n) {vexnum = n;vertices = new Object[n];arcs = new int[n][n];visited = new boolean[n];for (int i = 0; i < vexnum; i++) {for (int j = 0; j < vexnum; j++) {arcs[i][j] = 0;}}}public void addVertex(Object[] obj) {this.vertices = obj;}public void addEdge(int i, int j) {if (i == j)return;arcs[i][j] = 1;    //单独一条表示有向图//arcs[j][i] = 1;   // 这一条打开是无线图}public int firstAdjVex(int i) {for (int j = 0; j < vexnum; j++) {if (arcs[i][j] > 0)return j;}return -1;}public int nextAdjVex(int i, int k) {for (int j = k + 1; j < vexnum; j++) {if (arcs[i][j] > 0)return j;}return -1;}// 深度优先遍历public void depthTraverse() {for (int i = 0; i < vexnum; i++) {visited[i] = false;}for (int i = 0; i < vexnum; i++) {if (!visited[i])traverse(i);}}// 一个连通图的深度递归遍历public void traverse(int i) {// TODO Auto-generated method stubvisited[i] = true;visit(i);for (int j = this.firstAdjVex(i); j >= 0; j = this.nextAdjVex(i, j)) {if (!visited[j])this.traverse(j);}}// 广度优先遍历  任意节点开始,这里是第二节点开始public void broadTraverse2(int n) {// LinkedList实现了Queue接口Queue<Integer> q = new LinkedList<Integer>();for (int i = 0; i < vexnum; i++) {visited[i] = false;}if (!visited[n]) {q.add(n);visited[n] = true;visit(n);while (!q.isEmpty()) {int j = (Integer) q.remove().intValue();int k = this.firstAdjVex(j);for ( k = this.firstAdjVex(j); k >= 0; k = this.nextAdjVex(j, k)) {if (!visited[k]) {q.add(k);visited[k] = true;visit(k);}}}}}// 广度优先遍历  默认从0开始public void broadTraverse(int n) {// LinkedList实现了Queue接口Queue<Integer> q = new LinkedList<Integer>();for (int i = 0; i < vexnum; i++) {visited[i] = false;}for (int i = 0; i < vexnum; i++) {if (!visited[i]) {q.add(i);visited[i] = true;visit(i);while (!q.isEmpty()) {int j = (Integer) q.remove().intValue();for (int k = this.firstAdjVex(j); k >= 0; k = this.nextAdjVex(j, k)) {if (!visited[k]) {q.add(k);visited[k] = true;visit(k);}}}}}}private void visit(int i) {// TODO Auto-generated method stubSystem.out.print(vertices[i] + " ");}// 最后一个public int lastAdjVex(int i) {for (int j = vexnum - 1; j >= 0; j--) {if (arcs[i][j] > 0)return j;}return -1;}// 上一个public int lastAdjVex(int i, int k) {for (int j = k - 1; j >= 0; j--) {if (arcs[i][j] > 0)return j;}return -1;}
}

有向图的深度和广度遍历相关推荐

  1. 数据结构【图】—022邻接矩阵的深度和广度遍历

    1 #include "000库函数.h" 2 //无向图 3 4 typedef char VertexType; /* 顶点类型应由用户定义 */ 5 typedef int ...

  2. 数据结构【图】—023邻接表深度和广度遍历

    1 #include "000库函数.h" 2 //无向图 3 4 #define MAXSIZE 9 /* 存储空间初始分配量 */ 5 #define MAXEDGE 15 6 ...

  3. 数据结构 - 图的基本操作 深度和广度遍历

    ##代码实现 ###main.cpp(主函数) #include <iostream> #include "CMap.h" using namespace std;/* ...

  4. 数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)

    摘自:数据结构--无向图创建邻接表以及深度遍历.广度遍历(C语言版) 作者:正弦定理 发布时间:2020-12-22 20:55:12 网址:https://blog.csdn.net/chinese ...

  5. 图的深度遍历和广度遍历

    理论部分 图的深度遍历和广度遍历都不算很难像极了二叉树的前序遍历和层序遍历,如下面的图,可以用右边的邻接矩阵进行表示,假设以顶点0开始对整幅图进行遍历的话,两种遍历方式的思想如下: 1. 深度优先遍历 ...

  6. java多线程 文件夹_Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合

    复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...

  7. python来进行图的深度遍历和广度遍历

    python来进行图的深度遍历和广度遍历 # -*- coding: utf-8 -*- """ Created on Sat Sep 14 18:01:27 2019@ ...

  8. 深度遍历 java_java 图论一 深度遍历和广度遍历

    图对建模很有帮助. 图的基本知识: Java实现图的两种方法 1邻接矩阵 邻接矩阵是用二维数据,使用1代表节点间有边,如下表格: A B C D A 0 1 1 1 B 1 0 0 1 C 1 0 0 ...

  9. 二叉树层次遍历--广度遍历和深度遍历

    问题来源:二叉树层次遍历 问题描述:给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例子: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 ...

最新文章

  1. python编写ATM类_Python中编写类的各种技巧和方法
  2. javascript如何处理很多数据,类似分页切换
  3. 继 Swin Transformer 之后,MSRA 开源 Video Swin Transformer,在视频数据集上SOTA
  4. python标准库有pickle_Python标准库05 存储对象 (pickle包,cPickle包)-阿里云开发者社区...
  5. dw二级联动下拉菜单插件 宋君墨_Excel实例——一级、二级、多级下拉菜单一次讲透...
  6. Objective C中数组排序几种情况的总结
  7. [JAVA][Eclipse]JVM terminated. Exit code=13
  8. Gentoo Linux 内核指南
  9. java ajax动态加载数据_java实现的highcharts与ajax结合动态实时获取数据更新图表
  10. 主角连击敌人处理:连击次数的显示(图片数字字体)---1
  11. 假设某台台式计算机的内存储器容量为128,假设某台式计算机的内存储器容量为128MB,硬盘容量为10GB。硬盘的容量是内存容量的60倍。...
  12. 实对称矩阵对角化为什么要做正交化单位化操作呢?
  13. 360显示服务器拒绝访问,Tecplot 360 2011安装方法 对于“目标文件夹拒绝访问”的解决...
  14. ubuntu18.04 编译rtt-lwr
  15. 用Html实现世纪佳缘交友注册页面是什么体验?
  16. 新川抖音短视频营销平台是怎么样帮助企业运营抖音蓝V号的?
  17. 关于排版的小软件的实现
  18. 全球首家!苹果市值达 3 万亿美元,AR 和自动驾驶是下一重点?
  19. python+OpenCV笔记(二十四):Shi-Tomasi角点检测
  20. Scrapy可以成功爬取数据,但存储数据的json文件为空(巨坑!!!)

热门文章

  1. 【题意+解析】1041 Be Unique (20 分)_18行代码AC
  2. 【图示,简单明了】HttpServlet中getAttribute和getParameter的区别——【javaweb系列学习笔记】
  3. [leetcode]112.路径总和
  4. 所有计算机的字数都是8位,计算机(全部笔记).doc
  5. python课本第二章答案_《Python自然语言处理》答案第一、二章
  6. mysql 日期前n天_MySQL日期范围查询,当前日期的前后几天
  7. Linux虚拟机最小化安装后转换成图形界面(图文详解)
  8. C#结构体中数组的分配
  9. cas返回mysql数据_单点登录 CAS 5.* - 从数据库获取用户信息 - 4
  10. c语言试卷浙江理工大学杀人案件追踪,浙江理工大学c语言期末考试模拟试卷6 .pdf...