深度優先遍歷DFS 與 廣度優先遍歷BFS(java實現)
圖的遍歷方式有倆種:
- 深度優先遍歷(DFS)
- 廣度優先遍歷(BFS)
(1)深度優先遍歷(利用棧和遞迴來實現)
思路:先以一個點為起點,這裡假如是點A,那麼就將A相鄰的點放入堆疊,然後在棧中再取出棧頂的頂點元素(假如是點B),再將B相鄰的且沒有訪問過的點放入棧中,不斷這樣重複操作直至棧中元素清空。這個時候你每次從棧中取出的元素就是你依次訪問的點,以此實現遍歷。
class Node {
int x;
Node next;
public Node(int x) {
this.x = x;
this.next = null ;
}
}
public class DFS {
public Node first;
public Node last;
public static int run[] = new int[9];
public static DFS head[] = new DFS[9];
public static void dfs(int current) {
run[current] = 1;
System.out.print("[" + current + "]");
while (head[current].first != null ) {
if(run[head[current].first.x] == 0) { //如果頂點尚未遍歷,就進行dfs遞迴
dfs(head[current].first.x);
}
head[current].first = head[current].first.next;
}
}
public boolean isEmpty() {
return first == null;
}
public void print() {
Node current = first;
while (current != null) {
System.out.print("[" + current.x + "]");
current = current.next;
}
System.out.println();
}
public void insert(int x) {
Node newNode = new Node(x);
if(this.isEmpty()) {
first = newNode;
last = newNode;
}
else {
last.next = newNode;
last = newNode;
}
}
public static void main(String[] args) {
int Data[][] = { {1,2}, {2,1}, {1,3}, {3,1}, {2,4}, {4,2},
{2,5}, {5,2}, {3,6}, {6,3}, {3,7}, {7,3}, {4,5}, {5,4},
{6,7}, {7,6}, {5,8}, {8,5}, {6,8}, {8,6} };
int DataNum;
int i,j;
System.out.println("圖形的鄰接表內容為:");
for(i=1;i<9;i++) {
run[i] = 0;
head[i] = new DFS();
System.out.print("頂點" + i + "=>");
for (j=0;j<20;j++) {
if(Data[j][0] == i) {
DataNum = Data[j][1];
head[i].insert(DataNum);
}
}
head[i].print();
}
System.out.println("深度優先遍歷頂點:");
dfs(1);
System.out.println("");
}
}
(2)廣度優先遍歷:(基於佇列和遞迴的方式)
思路:基本操作是和深度優先差不多的,只不過這裡是通過佇列來實現的,找到一個起點A,並將A相鄰的點放入佇列中,這時將隊首元素B取出,並將B相鄰且沒有訪問過的點放入佇列中,不斷重複這個操作,直至佇列清空,這個時候依次訪問的頂點就是遍歷的順序。
class Node {
int x;
Node next;
public Node(int x) {
this.x = x;
this.next = null;
}
}
public class BFS {
public Node first;
public Node last;
public static int run[] = new int[9];
public static BFS head[] = new BFS[9];
public final static int MAXSIZE = 10;
static int[] queue = new int[MAXSIZE];
static int front = -1;
static int rear = -1;
public static void enqueue(int value) {
if(rear>=MAXSIZE) return;
rear++;
queue[rear] = value;
}
public static int dequeue() {
if(front == rear) return -1;
front++;
return queue[front];
}
public static void bfs(int current) {
Node tempnode;
enqueue(current);
run[current] = 1;
System.out.print("[" + current + "]");
while (front != rear) {
current = dequeue();
tempnode = head[current].first;
while (tempnode != null) {
if(run[tempnode.x] == 0) {
enqueue(tempnode.x);
run[tempnode.x] = 1;
System.out.print("[" + tempnode.x + "]");
}
tempnode = tempnode.next;
}
}
}
public boolean isEmpty() {
return first == null;
}
public void print() {
Node current = first;
while(current != null) {
System.out.print("[" + current.x + "]");
current = current.next;
}
System.out.println();
}
public void insert(int x) {
Node newNode = new Node(x);
if(this.isEmpty()) {
first = newNode;
last = newNode;
}
else {
last.next = newNode;
last = newNode;
}
}
public static void main(String[] args) {
int Data[][] = { {1,2}, {2,1}, {1,3}, {3,1}, {2,4}, {4,2},
{2,5}, {5,2}, {3,6}, {6,3}, {3,7}, {7,3}, {4,5}, {5,4},
{6,7}, {7,6}, {5,8}, {8,5}, {6,8}, {8,6} };
int DataNum;
int i,j;
System.out.println("圖形的鄰接表內容為:");
for(i=1;i<9;i++) {
run[i] = 0;
head[i] = new BFS();
System.out.print("頂點" + i + "=>");
for (j=0;j<20;j++) {
if(Data[j][0] == i) {
DataNum = Data[j][1];
head[i].insert(DataNum);
}
}
head[i].print();
}
System.out.println("深度優先遍歷頂點:");
bfs(1);
System.out.println("");
}
}
相關推薦
深度優先遍歷DFS 與 廣度優先遍歷BFS(java實現)
圖的遍歷方式有倆種: 深度優先遍歷(DFS) 廣度優先遍歷(BFS) (1)深度優先遍歷(利用棧和遞迴來實現) 思路:先以一個點為起點,這裡假如是點A,那麼就將A相鄰的點放入堆疊,然後在棧中再取出棧頂的頂點元素(假如是點B),再將B
資料結構與演算法 -- 二叉搜尋樹(java實現)
package com.huang.test.datastructure; import java.util.*; /** * 二叉搜尋樹 */ abstract class BstData<T> { BstData<T> left;
鄰接表實現--圖的深度優先遍歷DFS和廣度優先遍歷BFS
圖論中一個基本的概念就是遍歷。就是訪問到圖的每一個頂點,同時每個頂點只訪問一次。 DFS和BFS的概念和思路網上說明的很詳細了。但是網上很多程式碼實現有缺陷,基本都沒有考慮圖不連通的情況,比如某個頂點A和其它任何一個頂點都不關聯,
圖的深度優先遍歷(DFS)和廣度優先遍歷(BFS)算法分析
search 圖的深度優先遍歷 eight 一個 ima 圖的廣度優先遍歷 spa color 一句話 1. 深度優先遍歷 深度優先遍歷(Depth First Search)的主要思想是: 1、首先以一個未被訪問過的頂點作為起始頂點,沿當前頂點的邊走到未訪
深度優先搜尋(DFS)與廣度優先搜尋(BFS)
深度優先搜尋的基本模型 void dfs(int step) { 判斷邊界 嘗試每一種可能 for(int i=0; i<n; i++) { 繼續下一步 dfs(step+1); } 返回 } 輸出一個
圖:深度優先遍歷和廣度優先遍歷(Java實現)
深度優先遍歷 深度優先遍歷,從初始訪問結點出發,我們知道初始訪問結點可能有多個鄰接結點,深度優先遍歷的策略就是首先訪問第一個鄰接結點,然後再以這個被訪問的鄰接結點作為初始結點,訪問它的第一個鄰接結點。總結起來可以這樣說:每次都在訪問完當前結點後首先訪問當前結點的
圖的深度、廣度優先搜尋(JAVA實現)
import java.util.*; public class DFS { /** * @param args */ final static int MAXN = 100; static Scanner scan = new Scanner(System.in)
數據結構之中序遍歷轉興許遍歷(JAVA實現)(二)
百度 empty 表達 pty 中序 tor opera lin sem 算法流程: 主要分為四步: 1.當前字符為數字或者字母,則直接輸出 2.當前字符為)。則在棧中匹配輸出。一直匹配到),則停止輸出(就是將)及其
基於堆的優先佇列(Java實現)
優先佇列的最重要的操作:刪除最大元素(或最小)和插入元素。資料結構二叉堆能夠很好的實現佇列的基本操作。 二叉堆的結點按照層級順序放入陣列,用長度為N+1的私有陣列pq來表示一個大小為N的堆(堆元素放在pq[1]至pq[N]之間,為方便計數,未使用pq[0]),跟
二叉樹三種遍歷方式及通過兩種遍歷重構二叉樹(java實現)
重構方法參考文章【重構二叉樹(Java實現):https://blog.csdn.net/wangbingcsu/article/details/51372695】 文章目錄 二叉樹類 三種遍歷方式 前序遍歷 中序遍歷 後序遍歷
劍指offer23 二叉搜尋樹的後序遍歷序列(java實現)
題目 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 思路(遞迴) 後序遍歷,即根節點最後輸出。這是解題線索。 我們根據陣列最後一個數來遍歷整個陣列 比陣列小的是這
資料結構-二叉樹的遍歷(Java實現)
二叉樹介紹 二叉樹的概念:一棵二叉樹是節點的一個有限集合,該集合或者為空,或者由一個根節點加上兩棵左子樹和右子樹組成 二叉樹具有如下特點: 1、每個結點最多有兩棵子樹,結點的度最大為2。 2、左子樹和右子樹是有順序的,次序不能顛倒。 3、即使某結點只有
二叉樹系列--層序遍歷(java實現)
記錄兩道題目: 第一題:計算二叉樹的深度,兩行遞迴即可搞定。 public static int level(Node root) { if (root == null) return 0; return level(root.left) + 1 > l
二叉樹的遍歷(Java實現)
列舉了二叉樹的前序、中序、後序的遞迴和非遞迴遍歷方法,以及層次遍歷、分層輸出的層次遍歷方法。 舉例如下: import java.util.LinkedList; import java.util.List; import java.util.Que
二叉樹的前序遍歷,中序遍歷,後序遍歷(Java實現)
1.前序遍歷 前序遍歷(DLR,lchild,data,rchild),是二叉樹遍歷的一種,也叫做先根遍歷、先序遍歷、前序周遊,可記做根左右。前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左、右子樹時,
數據結構與算法—插入排序(Java實現)
數據結構 算法 Java 插入排序 [toc] 插入排序 程序代碼 package com.uplooking.bigdata.datastructure; import java.util.Arrays; public class InsertSort { public st
數據結構與算法—冒泡排序(Java實現)
數據結構 算法 Java 冒泡排序 [toc] 冒泡排序 程序代碼 package com.uplooking.bigdata.datastructure; import java.util.Arrays; public class BubbleSort { public st
對稱矩陣與壓縮儲存演算法(java實現)
一、問題描述 實現一個對稱矩陣的壓縮儲存 二、演算法分析 對稱矩陣的特點:a[i][j] = a[j][i].即所有元素關於對角線對稱 所以可以將對稱矩陣的下三角儲存在一個數組物件SA中,儲存方式是, SA[0] = a[0][0] SA[1] = a[1][0]  
深度學習之TensorFlow使用CNN測試Cifar-10資料集(Python實現)
題目描述: 1. 對Cifar-10影象資料集,用卷積神經網路進行分類,統計正確率。 2.選用Caffe, Tensorflow, Pytorch等開 源深度學習框架之一,學會安裝這些框架並呼叫它們的介面。 3.直接採用這些深度學習框架針對Cifar-10資料集已訓練好的網路模型,只
利用皮爾遜相關係數找出與目標最相關的特徵(Python實現)
#coding:utf-8 #檢測各特徵和輻照度之間的相關性以及各個特徵之間的相關性 from __future__ import division import tensorflow as tf import math import csv from sklearn imp