1 緒論
《數據結構主要是研究數據結構的邏輯結構、存儲結構以及定義在該結構上的操作及操作實現三個方面的內容。》
1.1 基本概念和常用術語
數據:數據是描敘客觀事物的數值、字符以及能輸入機器且能被處理的各種字符的集合,
u 即計算化的信息。
數據元素:數據元素也稱爲結點,它是組成數據的基本單位,是一個數據整體中相對獨立的單元。
字段:字段是構成數據的最小單位。
數據對象:在數據結構中,將性質相同的數據元素的集合稱爲數據對象,它是數據的一個子 集。
數據結構:由某一數據元素集合及該集合中所有數據元素之間的關係組成。具體來說,數據結構包含3個方面的內容,即數據的邏輯結構、數據的存儲結構和對數所施加的操作。
根據數據結構中元素之間的結構關係的不同特徵,通常將數據結構分爲如下四種基本結構:
(1)、集合結構(set)::數據元素的有限結合。
u (2)、線性結構或者稱爲序列::數據元素的有序結合。
u (3)、樹形結構(tree)::樹的層次結構,樹中數據元素之間存在一對多的關係。
u (4)、圖形結構:::圖中數據元素之間的關係是多對多。
1.2 邏輯結構
《結點和結點之間的邏輯關係稱爲數據的邏輯結構。》
(1)、線性結構。元素之間爲一對一的線性關係,第一個元素無直接前驅,最後一個元素無直接後繼,其餘元素都有一個直接前驅和直接後繼。
(2)、非線性結構。元素之間爲一對多或多對多的非線性關係,元素可有多個直接前驅或多個直接後繼。
(3)、集合結構。元素之間無任何關係,元素的排序無任何順序。
1.3 存儲結構
《數據的邏輯結構是獨立於計算機的,它與數據在計算中的存儲無關,要對數據進行處理,
就必須將數據存儲在計算機中。數據在計算機中的存儲方式稱爲 數據的存儲結構。數據的
存儲結構主要有4種。》
2 樹《一對多》
《樹形結構是計算機算法中最重要的非線性數據結構,其中以樹和二叉樹最爲常用,它可以很好地描述具有分支關係和層次特性的對象,同時也是具有層次關係的數據在計算機中的表示提供了一種自然的表示方法。》
2.1 樹的基本概念
樹(Tree)是由n(n>=0)個結點組成的有限集合。n=0的樹稱爲空樹;n>0的樹即爲任意一顆非空樹。
2.1.1 樹的邏輯表示方法
(1)、直接表示法
(2)、嵌套集合表示法
(3)、凹入表示法<似文檔目錄>
(4)、廣義表表示法
2.1.2 樹的基本術語
(1)、結點的度(degree)-----------指結點中所擁有的子樹的個數。
(2)、樹的度--------------是指樹中各結點的度的最大值。《結點的度的最大值》
(3)、結點的層次(level)---在樹中根節點的層次爲1,其餘任一結點的層次等於其雙親結點的層次加1.
(4)、樹的深度(depth)------樹中結點的最大層次稱爲樹的深度,又稱高度。
2.2 二叉樹的概念和性質
2.2.1 定義
二叉樹(binary tree)是指樹的度最大爲2的有序樹。它是一種最簡單、最重要的樹,在
計算機領域有着廣泛的應用。
2.2.2 二叉樹的性質
性質1:在一棵非空的二叉樹的第i層上,最多有2^i-1次方個結點(i>=0)。
性質2:一棵深度爲K的二叉樹,最多具有2^K-1個結點(K>=1)。
性質3:對任意一棵非空二叉樹,如果其終端結點數爲n0,度爲2的結點數爲n2,則n0=n2+1。
滿二叉樹:一棵深度爲K且含有2^k-1個結點的二叉樹稱爲滿二叉樹。
完全二叉樹:一個深度爲k,有n個結點的二叉樹,對樹中的結點按從上至下、從左到右的順序編號,如果編號爲i(1<=i<=n)的結點與滿二叉樹中編號爲i的結點在二叉樹中位置相同,則稱此二叉樹爲完全二叉樹。
性質4:具有n個結點的完全二叉樹的深度爲|log2N|+1.
性質5:如果對一棵有n個結點的完全二叉樹(其深度爲|log2N|+1)的結點按層次編號(從第一層到第|log2N|+1層,每層從左到),則對任一結點i(1<=i<=n),有如下性質:
(1)
3 圖《多對多》
3.1 圖的定義
圖(graph)是由非空的頂點集合和一個描述頂點之間的關係-----邊(或者弧)的有限集
合組成的一種數據結構。
3.2 圖的相關術語
| 無向圖:沒有方向。
| 有向圖:有方向,射線。
| 無向完全圖:有n*(n-1)/2條邊的圖<n爲頂點數>。
| 有向完全圖:有n*(n-1)條邊的圖<n爲頂點數>。
| 稀疏圖和稠密圖:由頂點引發邊的多少來判斷。
| 頂點的度,《入度,出度相對於有向圖來說》:無向圖頂點的度----引發的線段數
有向圖頂點的度<TD>----=入度<ID>+出度<OD>
| 權和網:權值,邊或者弧帶有權值的圖形成爲網。
| 路徑和路徑長度:路徑----由頂點和相鄰頂點偶對構成的邊所形成的序列
路徑長度------連接頂點的軌跡的權值相加。
| 迴路:從頂點回到頂點形成的閉合環形。
| 子圖:圖的部分。
| 連通圖和連通分量:《連通圖》:每頂點都能與其餘頂點相連想成的圖。《連通分量》:把不是連通圖拆分成多個子連通圖。
| 強連通圖和強連通分量:《強連通圖》---有向圖,雙向連接的連通圖 《強連通分量》:把不是強連通圖拆分成多個子強連通圖。
| 生成樹:它必包含且僅包含G的n-1條邊。《多一條:形成了迴路;少一條:非連通》
| 生成森林。
3.3 圖的存儲結構
3.3.1 鄰接矩陣存儲結構
形式:A[i][j]=@1: 1------代表兩頂點存在邊
=@2:0----代表兩頂點不存在邊
1:無向連接矩陣圖
特點:對稱分佈
頂點的度:行中非零點的個數。
2:有向連接矩陣圖
特點:一般不是對稱分佈,僅當它爲完全有向圖時對稱。
非零點的個數:行中非零點的個數代表出度。
列中非零點的個數代表入度
3:無向連接矩陣網
帶權圖,矩陣中的1用權值替換,0用無窮值替換。
4:有向連接矩陣網
帶權圖,矩陣中的1用權值替換,0用無窮值替換。
3.3.2 鄰接表存儲結構
《相對於稀疏圖來說,是爲了節約存儲空間,引入了指針》
1:無向圖鄰接表
《將每一頂點連接的線段轉換爲一個單鏈表。》
頂點的度爲:分得的段數.<節點數>
矩陣大小:n^2
2:有向圖鄰接表
《將每一頂點連接的線段轉換爲一個單鏈表。只關心出度。》
如果要關心入度則引入:有向圖逆鄰接表
3: 延伸
《延伸:對於一個具有n個頂點和e條邊的無向圖,若採取鄰接表表示,則表頭向量的大小爲:n, ;所有鄰接表中的結點總數是:2e》
4.4 棧和隊列
1:棧的定義《先進後出》------是限定只能在表的一端進行插入和刪除操作的線性表。(棧頂<允許插入和刪除的一端>,棧底<不允許插入和刪除的一端>)。
《分爲:順序棧和鏈棧》。
2:***順序棧,的定義,初始化,入棧,出棧,取棧頂元素操作,判斷空操作,置棧空操作。
3:多<雙>棧共享(鄰接空間)
4:鏈棧<涉及到指針>:棧也可以採用鏈式的存儲結構表示,這種結構的棧簡稱爲鏈棧。
鏈棧的操作---《@1:分配節點空間
@2:數據域
@3:指針域
@3:頂指針節點指向》
5:隊列---《先進先出,對其操作時:隊尾插入,對頭刪除。》:是一種限定性的線性表,它只允許在表的一端插入元素,而在表的另一端刪除數據。
《隊列分爲:順序隊列和鏈隊列》
6:順序隊列:隊列的順序存儲結構稱爲順序隊列,順序隊列實際上是運算受限的順序表,和順序表一樣,順序隊列也必須用一個向量空間來存放當前隊列中的元素。
由於隊列的對頭和隊尾的位置是變化的,因而要設置兩個指針front和rear,分別用於指示對頭元素和隊尾元素在向量空間的位置。
(特殊說明:指針front和rear初始化均應設置爲0;在非空隊列裏,頭指針始終指向對頭元素,而爲指針始終指向隊尾元素的下一個位置)
爲了防止“假溢出現象”引入-------循環隊列。
------循環隊列(在front==rear的情況下)是爲空還是隊列已滿:兩種方法--:
《
方法一:犧牲存儲空間。判斷隊列“滿”的條件爲(rear+1)MAXSIZE=front。
方法二:設置一個標誌變量的方法。(標誌tag=0表示最後的一次操作是出隊,tag=1表示最後的一次操作是入隊)---判斷隊空的條件爲:front==rear && tag==0
判斷隊滿的條件爲:front==rear && tag==1。
》
7:鏈隊列--隊列的鏈式存儲結構簡稱爲鏈隊列,它是限制僅在表頭刪除和表尾插入的單鏈表。顯然僅有單鏈表的頭指針不便於在表尾做插入操作,
爲此再添加一個爲指針,指向鏈表上的最後一個節點。於是,一個鏈隊列由一個頭指針和一個尾指針唯一確定。