資料結構 樹

2022-08-31 18:27:09 字數 1936 閱讀 1697

線性資料結構(例如鍊錶)在檢索資料項時,最壞情況下可能需要遍歷整個鍊錶才能找到檢索的資料項或者直接沒有找到要檢索的資料項,這樣檢索資料的時間複雜度為o(n),其中n為鍊錶的大小(即鍊錶中資料項的數目)。當需要處理的資料量很大時,這樣的時間複雜度是不可接受的。而使用二叉查詢樹(binary search tree)這種資料結構,在特定的條件限制下可以保證每種操作的時間複雜度保持在o(logn)。為了研究二叉查詢樹,首先介紹更一般的樹的概念和應用。

樹在電腦科學中有廣泛的應用,有多種方式可以定義樹,最常用的是遞迴定義的方式:一棵樹是一些節點的集合,這個集合可以是空集;若非空,則一棵樹由稱作根(root)的節點r以及0個或者多個非空的(子)樹t1,t2,t3。。。tk組成,這些子樹中每一棵的根都被來自根root的一條有向邊所連線。(樹可以看做乙個特殊的圖。)從定義可以看出,一棵樹由n個節點和n-1條邊組成,因為除了root節點之外所有的節點都有一條邊指向父節點。

相關定義:沒有子節點的節點稱為葉節點(leaf);有相同父節點的節點稱為兄弟節點;從節點n1到nk的路徑(path)定義為節點n1,n2,。。。nk的乙個序列,使得對於1<=i樹的乙個實現方式是在樹節點中除了儲存資料外還要儲存所有指向其子節點的指標,但實際上由於樹節點的子節點個數不確定,因此要儲存的指標個數也是不確定的,因此不能使用這種做法。解決方法是將每個節點的所有兒子都放在樹節點的鍊錶中,稱為第一兒子/下一兄弟表示法,定義如下:

typedef struct treenode * ptrtonode;

struct treenode

elementtype element;

ptrtonode   firstchild;    //指向第乙個兒子

ptrtonode   nextsibling;//指向兄弟節點

樹在各種流行的作業系統的檔案系統中得到了廣泛的應用,用於組織檔案系統的目錄結構。檔案系統中包括目錄和檔案,其中目錄也是一種檔案,包括了其子目錄與子檔案資訊。下面介紹兩種檔案系統中常見的操作的實現方式,分別是列印目錄中所有檔案的名字以及計算每個目錄(檔案)占用的磁碟區塊的數目。

列印目錄中的所有檔名,同時需要根據檔案的深度列印相應數目的縮排。例程如下:

static void listdir(directoryorfile d,int depth)

if(d is a legitimate entry)

printname(d,depth);

if(d is a directory)

for each child c of d

listdir(c,depth+1);

void listdirectory(directoryorfile d)

listdir(d,0);

演算法的核心是遞迴過程listdir,其中depth是實現縮排顯示的內部簿記變數,不是外部主調例程需要知道的引數,因此使用驅動例程listdirectory將遞迴例程listdir與外部主調例程連線起來。這裡使用遍歷策略是先序遍歷,在先序遍歷中,對節點的處理是在它的諸兒子被處理之前進行的。

檔案系統中另一種常見的操作是計算檔案(目錄)的大小,目錄本身也有大小,因此最直觀的思路是將目錄本身的大小加上目錄中各個子目錄(檔案)的大小,這裡採用後序遍歷的演算法來實現,在後序遍歷中,在乙個節點處的工作實在它的諸子節點被計算後進行的,**如下:

static void sizedirectory(directoryorfile d)

int totalsize=0;

if(d is a legitimate entry)

totalsize=filesize(d);

for each child c of d

totalsize+=sizedirectory(c);

return totalsize;

在樹的各種操作的實現方式中,利用遞迴的思想是非常常見的。樹本身就可以利用遞迴方式來定義,因此可以很方便的將遞迴的思想利用到樹的處理中。另外,很多樹操作也可以使用非遞迴的思想實現,例如使用迭代的思想處理。

資料結構 樹

樹的概念 1.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...

資料結構 樹

1 定義 樹是一種非線性結構,是一種一對多的資料結構。分析樹的結構,我們用遞迴的方法,根結點下面又可以看做是子樹。2 樹的儲存結構 我們一般用孩子兄弟法儲存。也就是把乙個結點的左邊第乙個孩子放在此結點的左邊孩子,把此結點的右兄弟放在此結點的右邊孩子。這樣就產生了二叉樹。二叉樹和樹可以相互對應。3 二...

資料結構 樹

二叉樹性質回顧 滿二叉樹 完全二叉樹等 給定一棵二叉樹,要求分層遍歷該二叉樹,即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。我們在遍歷的過程中將該層節點的孩子節點壓入乙個佇列,這樣就可以實現從上到下一層一層地遍歷該二叉樹。層序遍歷 並分層列印 如果不用分層的話只用佇列...