資料結構 樹

2021-10-02 14:42:14 字數 1743 閱讀 5237

假設有一組連續空間儲存樹的結點,同時在每個結點中,附設乙個指示器指示其雙親結點到鍊錶的位置。也就是說,每個結點除了知道自己是誰以外,還知道它的雙親在**。

#define max_tree_size 100

typedef

int telemtype;

typedef

struct ptnode

ptnode;

typedef

struct

根結點沒有雙親,則約定根結點位置域設定為-1

這樣的儲存結構,我們可以根據結點的parent指標很容易找到它的雙親,時間複雜度為o(1)。

但是想要知道結點的孩子是什麼,需要遍歷整個結構。

前文描述到找到結點的孩子需要遍歷整個結構,這是非常麻煩的。

我們增加乙個結點最左邊孩子的域,不妨叫它長(zhang)子域,這樣就可以很容易得到結點的孩子。如果沒有孩子的結點,則這個長子域就設定為-1。

對於有0或者1個孩子結點來說,這樣的結構是解決了要找結點孩子的問題,甚至是有2個孩子,知道了長子是誰,另外乙個就是次子了。

但我們很關注各兄弟之間的關係,雙親表示法就無法體現了。我們可以增加乙個右兄弟域體現兄弟關係。

方案一:如果樹的各個結點的度相差很小,取最大值n,定義child1…childn的指標域。

data

child1

child2

child3

…childn

方案二:樹的結點的度相差很大,方案一會浪費很多空間,因為有很多結點,它的指標域都是空的。第二種方案每個節點指標域的個數等於該結點的度,專門取乙個位置來儲存結點指標域的個數。

data

degree

child1

child2

…childn

這種方法克服了空間的浪費,但是由於每個結點在鍊錶上是不同的結構,加上還要維護結點度的數值,在運算上會帶來時間上的損耗。

孩子表示法的具體方法是:把每個結點的哦孩子結點排列起來,以單鏈表作為儲存結構,則n個結點就有n個孩子的鍊錶,如果是葉子結點,則此單鏈表為空。然後n個頭指標又組成乙個線性,採用順序儲存結構,存進乙個一維陣列中。

孩子鍊錶的孩子結點:

child

next

表頭陣列的表頭結點:

data

firstchild

#define max_tree_size 100

typedef

struct ctnode//孩子結點

*childptr;

typedef

struct

//表頭結構

ctbox;

typedef

struct

//樹結構

data

firstchild

rightsib

typedef

struct csnode

csnode,

*cstree;

這種表示法,給查詢某個結點的某個孩子帶來方便,只要通過firstchild找到此結點的長子,通過長子的rightsib找到他的二弟,一直下去就可以找到目標孩子。

如果想要找到某個孩子的雙親,增加乙個parent指標域即可。

這種表示法很好的將一棵複雜的樹變成了二叉樹。

資料結構 樹

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

資料結構 樹

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

資料結構 樹

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