1. 程式人生 > >深度優先遍歷DFS 與 廣度優先遍歷BFS(java實現)

深度優先遍歷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 廣度優先BFSjava實現

圖的遍歷方式有倆種: 深度優先遍歷(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