数据结构Java版之深度优先-图(十二)

这里用深度优先遍历存在矩阵里面的图。

  深度优先利用的是栈的FIFO特性。为此遍历到底后,可以找到最相邻的节点继续遍历。实现深度优先,还需要在节点加上一个访问标识,来确定该节点是否已经被访问过了。

源码:

package mygraph;

import java.util.Stack;

public class DFS_Vertex {   //创建一个我们需要的节点类
    class Vertex {
        private char lable;
        private int val;
        private boolean wasvisited;
        Vertex(char lable) {
            this.lable = lable;
        }
        Vertex() {

        }
    }
    private char lable; // 矩阵元素
    private Vertex[][] list = new Vertex[20][20];
    private Vertex[] vertexList = new Vertex[20];
    private int nVerts; // 当前顶点下标
    DFS_Vertex() {
        this.nVerts = 0;
        for(int i = 0; i < 20; i ++) {
            for(int j = 0; j < 20; j ++) {
                list[i][j] = new Vertex();
            }
        }
    }

    // 增加一个顶点
    public void addVertex(char lable) {
        vertexList[nVerts++] = new Vertex(lable);
    }

    // 增加一条边
    public void addEdge(int start, int end) {
        list[start][end].val = 1;
        list[end][start].val = 1;
    }

    // 打印矩阵
    public void printMatrix() {
        for (int i = 0; i < nVerts; i++) {
            for (int j = 0; j < nVerts; j++) {
                System.out.print(list[i][j].val);
            }
            System.out.println();
        }
    }
    //显示字符
    public void showVertex(int v) {
        System.out.print(vertexList[v].lable + "\t");
    }
    //获得邻接未访问节点
    public int getAdjUnvisitedVertex(int v) {
        for(int j = 0; j < nVerts; j ++) {
            if((list[v][j].val == 1) && (vertexList[j].wasvisited == false)) {
                return j;
            }
        }
        return -1;
    }
    //DFS
    public void DFS() {
        Stack<Integer> s = new Stack();
        vertexList[0].wasvisited = true;
        showVertex(0);
        s.push(0);
        int v;
        while(s.size() > 0) {
            v = getAdjUnvisitedVertex(s.peek());
            if(v == -1) {
                s.pop();
            }else {
                vertexList[v].wasvisited = true;
                showVertex(v);
                s.push(v);
            }
        }
        for(int j = 0; j < nVerts; j ++) {
            vertexList[j].wasvisited = false;
        }
    }

}

测试程序:

    public static void main(String[] args) {
        DFS_Vertex ds = new DFS_Vertex();
        ds.addVertex(‘A‘);    //0
        ds.addVertex(‘B‘);    //1
        ds.addVertex(‘C‘);    //2
        ds.addVertex(‘D‘);    //3
        ds.addVertex(‘E‘);    //4
        ds.addEdge(0, 1);    //A-B
        ds.addEdge(0, 3);    //A-D
        ds.addEdge(1, 4);    //B-E
        ds.addEdge(3, 4);    //D-E
        ds.addEdge(4, 2);    //E-C
        ds.printMatrix();
        ds.DFS();
    }

测试结果:

10001
00001
10001
01110
A    B    E    C    D

原文地址:https://www.cnblogs.com/ranter/p/9250017.html

时间: 2024-10-08 20:24:56

数据结构Java版之深度优先-图(十二)的相关文章

java痛苦学习之路[十二]JSON+ajax+Servlet JSON数据转换和传递

1.首先客户端需要引入 jquery-1.11.1.js 2.其次javaweb工程里面需要引入jar包  [commons-beanutils-1.8.0.jar.commons-collections-3.1.jar.commons-lang-2.4.jar.commons-logging-1.1.3.jar.ezmorph-1.0.6.jar.json-lib-2.3-jdk15.jar] 3.客户端js端代码 4.servlet 服务器,映射的路径CardColl 以上就是整个过程,如果

Java多线程和并发(十二),Java线程池

目录 1.利用Executors创建线程的五种不同方式 2.为什么要使用线程池 3.Executor的框架 4.J.U.C的三个Executor接口 5.ThreadPoolExecutor 6.线程池的状态 7.线程池大小如何选定 十二.Java线程池 1.利用Executors创建线程的五种不同方式 2.为什么要使用线程池 3.Executor的框架 4.J.U.C的三个Executor接口 5.ThreadPoolExecutor 虽然Executor提供的五种方法够用了,但是仍然不能满足

数据结构Java版之邻接表实现图(十)

邻接表实现图,实际上是在一个数组里面存放链表,链表存放的是连接当前节点的其他节点. package mygraph; import java.util.ArrayList; import java.util.List; public class Table { private List<List<Character>> list; private List<Character> headNodes; private int n; private int nVerts;

剑指Offer(Java版)第六十五题:给定一棵二叉搜索树,请找出其中的第k小的结点。 例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

/*给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4.*//*二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值*///思路:从最左边的叶子节点开始找起. import java.util.*; public clas

数据结构 Java版二叉排序树

二叉搜索树,又称为二叉查找树和二叉搜索树.它或者是一颗空树,或者具有下列性质的二叉树. 1 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值. 2 若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值. 3 它的左.右子树也都为二叉搜索树. 构造一颗二叉搜索树,目的不是为了排序,而是为了提高查找.插入和删除关键字的速度.一个有序数据集上的查找速度总是要快于无序数据集,而二叉搜索树这种非线性的结构,也有利于插入和删除的实现. 二叉搜索树的查找性能取决于二叉搜索树的形状,问

Java内存管理-探索Java中字符串String(十二)

做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 一.初识String类 首先JDK API的介绍: public final class String extends Object implements Serializable, Comparable<String>, CharSequence String类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符

数据结构算法C语言实现(十二)--- 3.4循环队列&amp;队列的顺序表示和实现

一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 1 //3_4_part1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-9 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 64 9 #include <cstdio

Java基础笔试练习(十二)

1.(C#.JAVA)扩展方法能访问被扩展对象的public成员 A.能 B.不能 答案: A 解析: 翻译一下,子类方法是否能够访问父类中的public成员. 2.如果子类要调用父类的构造函数,则通过super()调用来实现. A.正确 B.错误 答案: A 解析: super关键字在子类内部使用,代表父类对象. 访问父类的属性 super.属性名 访问父类的方法 super.方法名() 子类构造方法需要调用父类的构造方法时,在子类的构造方法体里最前面的位置:super() 3.下列关于Jav

数据结构Java版之遍历二叉树(六)

二叉树是我们在程序中用的最多的一种树(个人观点).最简单的一个二叉树是由一个根节点,两个子节点(一左一右成左右孩子节点)组成.二叉树是数组和链表的结合,即包含了数组的快速查找优点,又包含了链表的快速添加删除的优点.熟练掌握二叉树的遍历方法是很有必要的.下面来介绍一下基于二叉树的四种遍历方式. 下面我们以一个棵简单的二叉树为例来说明四种遍历: 创建树节点类: //树节点 class TreeNode { public char val; public TreeNode left; public T