学习地址:https://www.bilibili.com/video/BV1Zt411o7Rn【数据结构与算法基础-java版】
🚀数据结构--Java专栏:https://blog.csdn.net/weixin_44949135/category_10103369.html🚀
笔记01【01-09】https://blog.csdn.net/weixin_44949135/article/details/106742935【概述、数组基本使用】【源码、课件】
笔记02【10-18】https://blog.csdn.net/weixin_44949135/article/details/106746038【栈、队列、单链表、链表、递归】
笔记03【19-27】https://blog.csdn.net/weixin_44949135/article/details/106784224【八大排序算法】
笔记04【28-33】https://blog.csdn.net/weixin_44949135/article/details/106823785【树结构概述、二叉树】
笔记05【34-39】https://blog.csdn.net/weixin_44949135/article/details/106832176【顺序存储二叉树、堆排、线索二叉树】
笔记06【40-48】https://blog.csdn.net/weixin_44949135/article/details/106843814【赫夫曼树、解码、压缩&解压文件】
笔记07【49-54】https://blog.csdn.net/weixin_44949135/article/details/106886659【二叉排序树】
笔记08【55-57】https://blog.csdn.net/weixin_44949135/article/details/106896570【平衡二叉树(AVL)】
笔记09【58-60】https://blog.csdn.net/weixin_44949135/article/details/106852286【计算机数据存储原理、2-3树、B树】
笔记10【61-63】https://blog.csdn.net/weixin_44949135/article/details/106936504【哈希表、散列函数设计、解决冲突】
笔记11【64-67】https://blog.csdn.net/weixin_44949135/article/details/106939350【图概述、图遍历(DFS、BFS)】
目 录
P64 6.1 图结构概述
P65 6.2 图结构代码实现
邻接矩阵:用数字标识顶点之间是否连通。
P66 6.3 图的遍历原理
1、深度优先搜索---DFS(栈)
从第一个节点(比如:节点A)开始遍历,找下一个邻接节点,看其通不通。
A作为出发点,一个点一个点地遍历。
2、广度优先搜索---BFS(队列)
将栈替换为队列(先进先出)。 波纹---一圈圈地搜索。
A进队列,从A开始往后找,找到B【从队列头A(出队方向)开始找下一个】
A找到C,C入栈
再从A开始往后找,D\E不通,A出队列,
看B与哪些节点连通->D(C已被访问)
再从B开始往后找,无未连通节点,B出队列;
再从C开始往后找,无未连通节点,C出队列;
再从D开始往后找,无未连通节点,D出队列;
再从E开始往后找,无未连通节点,E出队列;
BFS遍历完毕!
P67 6.4 图的遍历代码实现
1、Vertex.java
package demo14;
public class Vertex {// 顶点类
private String value;
//该节点是否遍历过-默认值false
public boolean visited;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Vertex(String value) {
super();
this.value = value;
}
@Override
public String toString() {
return value;
}
}
2、Graph.java
package demo14;
import demo2.MyStack;
public class Graph {// 图
private Vertex[] vertex;// 顶点数组
private int currentSize;
public int[][] adjMat;
private MyStack stack = new MyStack();
private int currentIndex;// 当前遍历的下标
public Graph(int size) {
vertex = new Vertex[size];
adjMat = new int[size][size];
}
/**
* 向图中加入一个顶点
*
* @param v
*/
public void addVertex(Vertex v) {
vertex[currentSize++] = v;
}
public void addEdge(String v1, String v2) {
// 找出两个顶点的下标
int index1 = 0;
for (int i = 0; i < vertex.length; i++) {
if (vertex[i].getValue().equals(v1)) {
index1 = i;
break;
}
}
int index2 = 0;
for (int i = 0; i < vertex.length; i++) {
if (vertex[i].getValue().equals(v2)) {
index2 = i;
break;
}
}
adjMat[index1][index2] = 1;
adjMat[index2][index1] = 1;
}
/**
* 深度优先搜索算法遍历图
*/
public void dfs() {
// 把第0个顶点标记为已访问状态
vertex[0].visited = true;
// 把第0个顶点的下标。
stack.push(0);
// 打印顶点的值
System.out.println(vertex[0].getValue());
// 遍历
out: while (!stack.isEmpty()) {
for (int i = currentIndex + 1; i < vertex.length; i++) {
// 如果和下一个遍历的元素是通的
if (adjMat[currentIndex][i] == 1 && vertex[i].visited == false) {
// 把下一个元素压入栈中
stack.push(i);
vertex[i].visited = true;
System.out.println(vertex[i].getValue());
continue out;
}
}
// 弹出栈顶元素
stack.pop();
// 修改当前位置为栈顶元素的位置
if (!stack.isEmpty()) {
currentIndex = stack.pick();
}
}
}
}
3、TestGraph.java
package demo14;
import java.util.Arrays;
public class TestGraph {
public static void main(String[] args) {
Vertex v1 = new Vertex("A");
Vertex v2 = new Vertex("B");
Vertex v3 = new Vertex("C");
Vertex v4 = new Vertex("D");
Vertex v5 = new Vertex("E");
Graph g = new Graph(5);
g.addVertex(v1);
g.addVertex(v2);
g.addVertex(v3);
g.addVertex(v4);
g.addVertex(v5);
// 增加边
g.addEdge("A", "C");
g.addEdge("B", "C");
g.addEdge("A", "B");
g.addEdge("B", "D");
g.addEdge("B", "E");
for (int[] a : g.adjMat) {
System.out.println(Arrays.toString(a));
}
// 深度优先遍历
g.dfs();
}
}
4、MyStack.java
package demo2;
public class MyStack {
// 栈的底层我们使用数组来存储数据
int[] elements;
public MyStack() {
elements = new int[0];
}
// 压入元素
public void push(int element) {
// 创建一个新的数组
int[] newArr = new int[elements.length + 1];
// 把原数组中的元素复制到新数组中
for (int i = 0; i < elements.length; i++) {
newArr[i] = elements[i];
}
// 把添加的元素放入新数组中
newArr[elements.length] = element;
// 使用新数组替换旧数组
elements = newArr;
}
// 取出栈顶元素
public int pop() {
// 栈中没有元素
if (elements.length == 0) {
throw new RuntimeException("stack is empty");
}
// 取出数组的最后一个元素
int element = elements[elements.length - 1];
// 创建一个新的数组
int[] newArr = new int[elements.length - 1];
// 原数组中除了最后一个元素的其它元素都放入新的数组中
for (int i = 0; i < elements.length - 1; i++) {
newArr[i] = elements[i];
}
// 替换数组
elements = newArr;
// 返回栈顶元素
return element;
}
// 查看栈顶元素
public int pick() {
// 栈中没有元素
if (elements.length == 0) {
throw new RuntimeException("stack is empty");
}
return elements[elements.length - 1];
}
// 判断栈是否为空
public boolean isEmpty() {
return elements.length == 0;
}
}
🚀完结撒花~ *★,°*:.☆( ̄▽ ̄)/$:*.°★* 。