數據結構筆記

1、每個程序所花費的運行次數稱為該程序的“時間復雜度”。判斷該程序執行效率是否良好。

2、

時間復雜度


漸進式表達法

3、內存的位置:

以行為主來表示:

Data[i][j]的內存位置 = 數組第一個元素位置 + [( i * 每一行的元素個數) + j] * (所聲明數據類型所占的大小)

以列為主表示

Data[i][j]的內存位置 = 數組第一個元素位置 + [( j * 每一行的元素個數) + i] * (所聲明數據類型所占的大小)

4、稀疏數組

數組中大部分的內容值都未被使用(或都為零),在數組中僅有少部分的空間使用。因此造成內存空間的浪費,為了節省內存空間,并不影響數組中原有的內容值,采用一種壓縮的方式來表示稀疏數組的內容。


稀松數組

5、上三角數組

一種方陣住對角線的左下方元素全部都為0的數組。


上三角數組(以行為主)


上三角數組(以列為主)

6、下三角數組


下三角數組(以行為主)
下三角數組(以列為主)

7、數組使用的是靜態的內存空間配置,靜態內存就是程序設計者必需在程序設計時,就要把所需的內存空間大小和數據類型給定義出。

8、鏈表

鏈表是一種有序的列表,鏈表的內容通常是存儲于內存中分散的位置上。鏈表串連的方式有兩種:一種是利用數組結構串連的有序列表。如利用兩個數組,一個存放數據,另一個存放鏈表的關系。

9、堆棧的輸出和輸入都是從堆棧的頂端進行,遵循“先進后出”的原則。

10、中序表達式的表示法,處理過程。

(1)


(2)

11、前序表達式的表示法


前序表達式的表示法

12、后序表達式的表示法


后序表達式的表示法

與前序表達式的唯一不同是讀取表達式的方向相反。

13、堆棧的應用

(1)子程序之調用:在跳往子程序前,會先將下一個指令的地址存到堆棧中,直到子程序執行完后再將地址取出,再回到原來的程序中。

(2)處理遞歸調用:和子程序的調用類似,只是除了存儲下一個指令的地址外,也將參數,區域變量等數據存入堆棧中。

(3)表達式之轉換與求值。

(4)二叉樹的遍歷。

(5)圖形的深度優先追蹤法。

建立堆棧可使用的兩種結構:數組結構和鏈表結構。隊列一樣。

14、隊列

在有序列表中數據的輸出、輸入是分別由不同端進行處理,輸出端稱為前端,輸入端稱為后端,這樣會使得先存入的數據會先被取出,也就是具有先進先出FIFO的特性。隊列本身是有序列表。

隊列的應用:

(1)圖形的廣度優先搜索法

(2)優先隊列,此種隊列在取出元素時是根據所存元素的某項特性值或優先權而取出具最小或最大數值的元素。

(3)操作系統中的工作調度,若工作的優先權相同,則采用先到先做的原則。

(4)用于“spooling”,先將輸出數據寫在磁盤上,再由打印機把先存入者先處理的順利將數據輸出。

15、從隊列中取出數據項稱為“delqueue”,delqueue的操作分為4個步驟“

(1)檢查隊列中是否有數據存在。

(2)若頭指針front等于尾指針rear,則表示隊列中無數據。

(3)若頭指針front不等于尾指針rear,則將隊頭指針往前移front+1。

(4)取出隊頭指針所指的數組元素內容。

16、遞歸

遞歸簡單的定義就是子程序或函數重復的調用自己,并傳入不同的變量來執行的一種程序設計技巧,而遞歸在程序設計及解題上也是一種有力、重要的工具,幫助程序設計者解決復雜的問題,并精簡程序結構。

17、解遞歸問題的步驟:

(1)了解題意是否適合用遞歸來解題。

(2)決定了遞歸結束條件。

(3)決定遞歸執行部分。

18、用遞歸設計一個求費氏級數的程序。

程序構思:

遞歸結束條件:當N<=1,返回費氏級數值為N。

遞歸執行部分: 當N>1時,返回費氏級數值為Fib(N-1)+Fib(N-2)。

程序:

int Fib(int N){

? if (N <= 1)

return N;

else

return Fib(N - 1) + Fib(N - 2);

}

void main(){

int Number;

int Result;

printf("The Fibonacci Numbers \n");

printf("Please enter a number:");

scanf("%d", &Number);

Result = Fib(Number);

printf("Fibonacci Numbers of %d = %d\n", Number , Result);

}

19、遞歸程序設計時,必須要有遞歸結束條件,否則將死循環。

遞歸程序利用堆棧來記錄函數調用后的返回地址。

遞歸程序的時間復雜度和控件復雜度比非遞歸程序有效率。

20、樹狀結構是由一個或多個節點所構成之有限集合。每棵樹必有一特定節點,稱作根節點。根節點之下可以有零個以上的子節點(可以沒有),而各子節點也可為子樹,擁有自己的子節點。

21、


樹的相關名稱及意義
樹的相關名稱及意義

22、二叉樹

二叉樹是樹的一種,二叉樹中的節點至多只能有兩個子節點。

二叉樹的定義:(1)由有限個節點所構成之集合,此集合可以為空的。

? ? ? ? ? ? ? ? ? ? ? ?(2)二叉樹的根節點下可分成兩個子樹,稱為左子樹和右子樹,左子樹和右子樹亦稱為二叉樹。

23、二叉樹和樹的比較

(1)二叉樹可為空,而樹不可以(至少要有根節點)。

(2)二叉樹的子樹有順序關系,而樹沒有。

(3)二叉樹的分支度必為0、1或2,而樹的分支度可以大于2。

24、二叉樹的相關特色

歪斜樹


滿二叉樹


完全二叉樹

24、二叉樹節點的表示法,常用的3種:

(1)二叉樹數組表示法

(2)二叉樹結構數組表示法

(3)二叉樹鏈表表示法

其中“數組表示法”和“結構數組表示法”是屬于靜態內存空間配置,而“鏈表表示法”是利用列表結構的方式,屬于動態內存空間配置。

25、二叉樹數組表示法


二叉樹數組表示法

26、建立二叉樹節點數據的原則:

(1)以第一個建立之元素為根節點。

(2)依序將元素值與根節點做比較

? ? ? (a)若元素值大于根節點值,則將元素值往根節點之右子節點移動,若此右子節點為空,則將元素存入,否則就重復比較,直到找到適當之空節點為止。

? ? ? (b)若元素值小于根節點值,則將元素值往根節點之左子節點移動,若此子節點為空,則將元素值存入,否則就重復比較,直到找到適當之空節點為止。

27、二叉樹數組表示法的優點:對于任一個節點都能很容易的找到其父節點、子節點及兄弟,而且每個節點的存儲空間不大,只占用數組的一個內存空間。但當二叉樹之深度和節點樹之比例偏高時(二叉樹分布不平均,如歪斜樹),則內存的利用率會偏低,容易造成空間的浪費。

28、二叉樹結構數組表示法

二叉樹中的節點最多只能有兩個子節點,我們可用結構的類型來聲明節點的存儲方法。此結構包含3個字段,其中一個字段是用來存放節點的數據內容,而另兩個字段則是分別存放左子樹和右子樹在數組中的索引值。


結構數組的類型

二叉樹的結構聲明如下:

struct tree{

? int left;

char data;

int right;

}

typedef struct tree treenode;

treenode b_tree[15];

聲明完成后,b_tree即是用來存放二叉樹各節點之結構數組。在結構數組中,會將根節點置于數組結構中索引值為0之處,將節點值存在data字段,而left及right字段則分別存儲左右子樹在數組結構中的索引值,若子樹不存在則存值-1。


29、二叉樹鏈表表示法


鏈表的節點結構

二叉樹鏈表結構的聲明如下:
struct tree{
?struct tree *left;
int data;
struct tree *right;
}
typedef struct tree treenode;
treenode *b_tree;

30、二叉樹的遍歷

二叉樹是一種特殊的數據結構,每個節點其下又各有左、右兩個分支。“二叉樹的遍歷”是以固定的順序,有系統地抽取二叉樹中的各節點,且每個節點均恰好被抽取一次。

二叉樹的遍歷是以遞歸的方式進行,依遞歸的調用順序之不同,可分為下列3種不同的遍歷方式:

1、前序遍歷方式

2、中序遍歷方式。

3、后序遍歷方式。

31、二叉樹的前序遍歷

前序遍歷是先遍歷根節點,在遍歷左子樹,最后才遍歷右子樹,若一棵二叉樹如下,則前序遍歷的順序為:DLR,也就是說每當遍歷一個節點就先處理該節點,之后先向左方前進,直到無法前進才往右方走。

例子



32、二叉樹的中序遍歷

中序遍歷是先遍歷左子樹,再遍歷根節點,最后才遍歷右子樹。若一棵二叉樹如下,則前序遍歷的順序為:LDR,也就是說一開始先往左方前進,直到無法前進才處理節點,之后再往右方前進。


中序遍歷


例子

33、二叉樹的后序遍歷

后序遍歷是先遍歷左子樹,再遍歷右子樹,最后才遍歷根節點。若一棵二叉樹如下,則前序遍歷的順序為:LRD,也就是說一開始先往左方前進,直到無法前進才再往節點的右方前進,最后才處理節點。



例子

34、二叉樹的查找

二叉查找樹的條件:每個節點的數據要大于左子節點的數據,且要小于右子節點的數據。


二叉樹的查找

35、二叉樹的節點刪除

先判斷欲刪除的節點是否存在于該二叉樹中。我們在刪除一個節點后,必須要維持滿足二叉查找樹數據排列的原則:左子節點<節點<右子節點。

當欲刪除一無左子樹也無右子樹的節點時,需要考慮到兩種情況:

(1)為根節點

如欲刪除無左、右子樹的根節點,只需將根節點指針root指向NULL即可。

(2)非根節點

若一節點為無左、右子樹的非根節點,那么該節點必為葉節點。如果節點為父節點的左子節點,則將父節點的zuo zhi左指針指向NULL,相同的,若節點為父節點的右子節點,則將父節點的右指針指向NULL。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 樹的概述 樹是一種非常常用的數據結構,樹與前面介紹的線性表,棧,隊列等線性結構不同,樹是一種非線性結構 1.樹的定...
    Jack921閱讀 4,489評論 1 31
  • 1 數據2 算法3 線性表4 棧5 隊列6 串樸素模式匹配算法 -子串的定位操作:從主串中找到子串KMP模式匹配算...
    oldSix_Zhu閱讀 1,531評論 0 4
  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,165評論 0 12
  • 基于樹實現的數據結構,具有兩個核心特征: 邏輯結構:數據元素之間具有層次關系; 數據運算:操作方法具有Log級的平...
    yhthu閱讀 4,320評論 1 5
  • 印象 是藏匿在紙間的光 連同著緘默穿過一扇扇的窗 如果是字跡之處的遺墨 它早已沉寂在遠方 小河里滌蕩著夕陽的靈魂 ...
    淡墨幽蘭閱讀 301評論 1 4