1,樹中結點能夠有多個後繼,而每一個結點都只有一個直接前驅,所以造成了一種層次結構;若是樹中的每一個結點也能夠有多個直接前驅,那麼這種層次結構都被破壞了;這樣就會造成網狀結構,會是一種新的數據結構,圖;數據結構
2,圖的定義:this
1,圖是由頂點集合(Vertex)及頂點間的關係集合(Edge)組成的一種數據結構 Graph = (V, E),其中,V = {x | x 屬於數據對象},是頂點的有窮非空集合(頂點集),E = {(x, y) | x, y 屬於 V } 是頂點之間的關係的有窮集合(邊集,能夠爲空);spa
3,無向邊:3d
1,頂點 x 和 y 之間的邊沒有方向,則稱該邊爲無向邊;指針
2,(x, y) 與 (y, x) 意義相同,表示 x 和 y 之間有鏈接;code
4,無向圖:對象
1,圖中任意兩個頂點之間的邊均是無向邊,則稱該圖爲無向圖;blog
5,有向邊:繼承
1,頂點 x 和 y 之間的邊有方向,則稱該邊爲有向邊;rem
2,<x, y> 與 <y, x> 意義不一樣:
1,<x, y> 表示從 x 鏈接到 y,x 稱爲尾,y 稱爲頭;
2,<y, x> 表示從 y 鏈接到 x,y 稱爲尾,x 稱爲頭;
6,有向圖:
1,圖中任意兩個頂點之間的邊均是有向邊,則稱該圖爲有向圖;
7,無向圖能夠看做一種特殊的有向圖,後續代碼實現圖的數據結構只考慮有向圖;
8,頂點鄰接(Adjacent)的定義:
1,無向圖:
1,若是 (x, y) 屬於 E,則稱頂點 x 和 y 互爲鄰接;
2,有向圖:
1,若是 <x, y> 屬於 E,則稱頂點 x 鄰接到頂點 y;
9,度(Degree)的定義:
1,頂點 v 的度是和 v 相關聯的邊的數目,記爲 TD(v):
1,入度:以 v 爲頭的邊的數目,記爲 ID(v);
2,出度:以 v 爲尾的邊的數目,記爲 OD(v);
2,推論:
10,權(Weight)的定義:
1,與圖的邊相關的數據元素叫作權;
2,權經常使用來表示圖中頂點間的距離或者耗費;
11,圖的一些經常使用的操做:
1,設置頂點的值;
2,獲取頂點的值;
3,獲取鄰接頂點;
4,設置邊的值;
5,刪除邊;
6,獲取頂點數;
7,獲取邊數;
12,圖在程序中表現爲一種特殊的數據類型:
13,圖抽象類的建立:
1 #ifndef GRAPH_H 2 #define GRAPH_H 3 4 #include "Object.h" 5 6 using namespace std; 7 namespace DTLib 8 { 9 10 /* 設置邊的數據結構,用於鄰接鏈表 */ 11 template < typename E > 12 struct Edge : public Object 13 { 14 int b; // 起點 15 int e; // 終點 16 E data; // 權值 17 18 Edge(int i=-1, int j=-1) 19 { 20 b = i; 21 e = j; 22 } 23 24 Edge(int i, int j, const E& value) 25 { 26 b = i; 27 e = j; 28 data = value; 29 } 30 31 /* 相等和不等不須要對權值進行比價,只比較起始點位置,刪除頂點操做中查找操做用到,在此處定義了 */ 32 bool operator == (const Edge<E>& obj) 33 { 34 return (b == obj.b) && (e == obj.e); 35 } 36 37 bool operator != (const Edge<E>& obj) 38 { 39 return !(*this == obj); 40 } 41 42 bool operator < (const Edge<E>& obj) 43 { 44 return (data < obj.data); // 權值比較邊的大小 45 } 46 47 bool operator > (const Edge<E>& obj) 48 { 49 return (data > obj.data); // 權值比較邊的大小 50 } 51 }; 52 53 /* 抽象類不可以用來繼承,能用來定義指針 */ 54 template < typename V, typename E > 55 class Graph : public Object 56 { 57 public: 58 virtual V getVertex(int i) = 0; // V 表示與頂點相關聯的數據類型 59 virtual bool getVertex(int i, V& value) = 0; 60 virtual bool setVertex(int i, const V& value) = 0; 61 virtual SharedPointer< Array<int> > getAdgacent(int i) = 0; 62 virtual bool isAdjacent(int i, int j) = 0;//i和j 是否鏈接,只能在繼承中實現 63 virtual E getEdge(int i, int j) = 0;// E表示與邊相關聯的數據類型,獲得邊上的//權值 64 virtual bool getEdge(int i, int j, E& value) = 0; 65 virtual bool setEdge(int i, int j, const E& value) = 0; 66 virtual bool removeEdge(int i, int j) = 0; 67 virtual int vCount() = 0; 68 virtual int eCount() = 0; 69 virtual int OD(int i) = 0; 70 virtual int ID(int i) = 0; 71 virtual int TD(int i) // 頂點 i 的度,即與頂點 i 相關聯的邊的數目 72 { 73 return OD(i) + ID(i); // 出度加上入度 74 } 75 }; 76 } 77 #endif // GRAPH_H
14,小結:
1,圖是頂點與邊的集合,是一種非線性的數據結構;
2,圖中頂點能夠與多個其餘頂點產生鄰接關係;
3,圖中的邊有與之對應的權值,表示頂點間的距離;
4,圖在程序中表現爲特殊的數據類型;