1. 程式人生 > >鄰接表儲存圖的深度優先、廣度優先遍歷非遞迴演算法

鄰接表儲存圖的深度優先、廣度優先遍歷非遞迴演算法

  之前在網上找圖的深度優先廣度優先的非遞迴演算法,前幾個都是以鄰接矩陣形式儲存的圖。所以自己就當練練手,寫了以鄰接表形式儲存的圖的兩種遍歷

  兩種遍歷關鍵是對於已遍歷的元素的儲存。

  深度優先利用了棧先進後出的特性,而廣度優先利用了佇列先進先出的特性

  寫得不好,請多多指教

void DFS(){//鄰接表儲存圖的非遞迴深度優先
	ArcNode *p;
	stack<int> s;
	cout << 0 << endl;//預設從0結點開始遍歷
	visited[0] = 1;//此為遍歷標誌陣列,0:未訪問,1:已訪問
	s.push(0);
	while (!s.empty()){
		p = V[s.top()].firstedge;
		while (p != NULL){
			if (visited[p->adjvex] != 1){
				cout << p->adjvex << endl;
				visited[p->adjvex] = 1;
				s.push(p->adjvex);
				break;
			}else{
				p = p->next;
			}
		}
		if (p == NULL){
			s.pop();
		}
	}
}

void BFS(){//鄰接表儲存圖的非遞迴廣度優先
	ArcNode *p;
	queue<int> q;
	cout << 0 << endl;//預設從0結點開始遍歷
	visited[0] = 1;//此為遍歷標誌陣列,0:未訪問,1:已訪問
	q.push(0);
	while (!q.empty()){
		p = V[q.front()].firstedge;
		q.pop();
		while (p != NULL){
			if (visited[p->adjvex] != 1){
				cout << p->adjvex << endl;
				visited[p->adjvex] = 1;
				q.push(p->adjvex);
			}
			p = p->next;
		}
	}
}

相關推薦

鄰接儲存深度優先廣度優先演算法

  之前在網上找圖的深度優先廣度優先的非遞迴演算法,前幾個都是以鄰接矩陣形式儲存的圖。所以自己就當練練手,寫了以鄰接表形式儲存的圖的兩種遍歷   兩種遍歷關鍵是對於已遍歷的元素的儲存。   深度優先利用了棧先進後出

資料結構實驗-C語言-二叉樹的建立,前後序遍歷遞迴演算法非遞迴演算法,求葉子結點數目,求二叉樹深度,判斷二叉樹是否相似,求二叉樹左右子樹互換,二叉樹層序遍歷演算法,判斷二叉樹是否是完全二叉樹

1.實驗目的 熟練掌握二叉樹的二叉連結串列儲存結構的C語言實現。掌握二叉樹的基本操作-前序、中序、後序遍歷二叉樹的三種方法。瞭解非遞迴遍歷過程中“棧”的作用和狀態,而且能靈活運用遍歷演算法實現二叉樹的其它操作。 2.實驗內容 (1)二叉樹的二叉連結串列的建立 (2)二叉樹的前、中、後

二叉樹先序中序後序演算法演算法

首先是二叉樹資料結構的定義: typedef struct TNode *Position; typedef Position BinTree; /* 二叉樹型別 */ struct TNode{ /* 樹結點定義 */ int Data; /* 結點資料 */ BinTre

二叉樹的先序()中序()後序()及層次java實現

二叉樹的先序遍歷,遞迴實現: public List<Integer> preorderTraversal(TreeNode root) { //用棧來實現 List<Integer> list = new ArrayList&l

二叉樹前序中序後序寫法的透徹解析

圖a的程式碼段(ii)也可寫成圖b的理由是:由於是葉子節點,p=-=p->rchild;之後p肯定為空。為空,還需經過新一輪的程式碼段(i)嗎?顯然不需。(因為不滿足迴圈條件)那就直接進入程式碼段(ii)。看!最後還是一樣的吧。還是連續出棧兩次。看到這裡,要仔細想想哦!相信你一定會明白的。

深度優先 廣度優先 圖解演算法過程

圖的鄰接矩陣表示 通常圖的表示有兩種方法:鄰接矩陣,鄰接表。 本文用鄰接矩陣實現,一是程式碼量更少,二是程式碼風格也更貼近C語言。但不論是圖的哪種實現方式,其基本的實現思想是不變的。 1:節點的資訊,我們用一維陣列a[n]來儲存,假設圖共有n個節點。 2:節點與節點間的關係

二叉樹中序後序和層序實現

一、中序遍歷 訪問順序:左子樹 -> 結點 -> 右子樹 難點在於訪問左子樹後應該怎麼回到結點本身或者其右子樹呢?這裡利用了堆疊來臨時儲存,需要利用上一個結點時可以pop出來(有種撤回鍵的感覺2333)。 void PreOrderTravel(BinTree BT){

鏈式二叉樹 先序中序後序

參考部落格:click here! 鏈式二叉樹儲存結構: typedef int DataType; typedef struct BiNode { DataType data; struct BiNode *lc, *rc; // 左右子節點指標 int depth; } B

二叉樹的先序中序後序 & 迴圈 兩種實現

一、預備知識 首先你得了解 樹 的基本概念,二叉樹是每個結點至多隻有兩個子結點的樹,常稱之為左右結點。 二叉樹的遍歷方式有 先序遍歷(preorder traeversal)、中序遍歷(inorder traversal)、後序遍歷(postorder traversal

二叉樹的先序中序後序層序實現與實現

1.總結深度優先與廣度優先的區別 1) 二叉樹的深度優先遍歷的非遞迴的通用做法是採用棧,廣度優先遍歷的非遞迴的通用做法是採用佇列。 2) 深度優先遍歷:對每一個可能的分支路徑深入到不能再深入為止,而且每個結點只能訪問一次。要特別注意的是,二叉樹的深度優先遍歷比較特殊,可以細分為先序遍歷、

JAVA實現二叉樹的前後序

最近在面試中遇到過問到二叉樹後序遍歷非遞迴實現的方法,之前以為會遞迴的解決就OK,看來還是太心存僥倖,在下一次面試之前,特地整理一下這個問題。 首先二叉樹的結構定義,java程式碼如下: public class Node { private

Leetcode:二叉樹的層序前中後序

102. 二叉樹的層次遍歷 給定一個二叉樹,返回其按層次遍歷的節點值。 (即逐層地,從左到右訪問所有節點)。 例如: 給定二叉樹: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回

資料結構——PTA 鄰接矩陣儲存深度優先鄰接儲存廣度優先

廣度優先與深度優先是遍歷圖的兩種基本方法,大致的思想是DFS為遞迴,而BFS是佇列。 這裡給出PTA兩道題目的答案,方法很基本,但第三個形參還是第一次見,去網上搜了搜給出的說法是呼叫函式的地址,但個人感覺就是呼叫這個函式。。。 下面給出兩段程式碼 void BFS ( LGraph

儲存鄰接)建立與深度優先廣度優先搜尋

#pragma once #include<iostream> #include<queue> using namespace std; #define Vnum 10 typedef int DATA; /*鄰接表儲存圖*/ typedef str

6-2 鄰接儲存廣度優先 (20 分)

試實現鄰接表儲存圖的廣度優先遍歷。 函式介面定義: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ); 其中LGraph是鄰接表儲存的圖,定義如下: /* 鄰接點的定義 */ typedef struc

6-2 鄰接儲存廣度優先 (20 分)第七章----基本概念-計算機17級

6-2 鄰接表儲存圖的廣度優先遍歷 (20 分) 試實現鄰接表儲存圖的廣度優先遍歷。 函式介面定義: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ); 其中LGraph是鄰接表儲存的圖,定

6-1 鄰接儲存廣度優先 (20 分)

6-1 鄰接表儲存圖的廣度優先遍歷 (20 分) 試實現鄰接表儲存圖的廣度優先遍歷。 函式介面定義: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) );

鄰接表示(有向無向)及廣度深度

鄰接表表示圖 #include <iostream> #include <malloc.h> #include <queue> using namespace std; #define VertexType char #define MaxVerte

建立有向鄰接深度優先廣度優先演算法,判斷是否是有向無環,並輸出一種拓撲序列

/*(1)輸入一組頂點,建立有向圖的鄰接表,進行DFS(深度優先遍歷)和BFS(廣度優先遍歷)。 寫出深度優先遍歷的遞迴和非遞迴演算法。 (2)根據建立的有向圖,判斷該圖是否是有向無環圖,若是,則輸出其一種拓撲有序序列。*/ #include<stdio.h>

6-16 鄰接儲存廣度優先

鄰接表儲存圖的廣度優先遍歷 (20 分) 試實現鄰接表儲存圖的廣度優先遍歷。 函式介面定義: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ); 其中LGraph是鄰接表儲存的圖,定義如下: /* 鄰