生活随笔
收集整理的這篇文章主要介紹了
树的概念及存储结构(双亲表示法,孩子表示法,孩子兄弟表示法)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 一. 樹(shù)的概念
- 二. 樹(shù)的存儲(chǔ)結(jié)構(gòu)
- (一). 雙親表示法
- (二). 孩子表示法
- 1. 定長(zhǎng)結(jié)點(diǎn)鏈表存儲(chǔ)結(jié)構(gòu)
- 2. 孩子鏈表存儲(chǔ)結(jié)構(gòu)
- (三). 孩子兄弟表示法
一. 樹(shù)的概念
樹(shù)(Tree)是n(n>=0)個(gè)結(jié)點(diǎn)的有限集。當(dāng) n = 0 時(shí),稱為空樹(shù)。在任意一顆非空樹(shù)中:
- 有且僅有一個(gè)特定的稱為 根(Root) 的結(jié)點(diǎn);
如上圖,A為根 - 當(dāng) n > 1 時(shí),其余結(jié)點(diǎn)可分為m(m > 0)個(gè)互不相交的有限集T1,T2,T3…Tm,其中每一個(gè)集合本身又是一顆樹(shù),并且稱為根的子樹(shù)。
B,C,D稱為A的子樹(shù)
樹(shù)的結(jié)點(diǎn)包含一個(gè)數(shù)據(jù)元素及若干指向其子樹(shù)的分支。結(jié)點(diǎn)擁有的子樹(shù)個(gè)數(shù)稱為結(jié)點(diǎn)的度。
A的子樹(shù)個(gè)數(shù)有3個(gè),即度為3。B的子樹(shù)個(gè)數(shù)為0,即度為0。度為0的結(jié)點(diǎn)稱為葉子或終端結(jié)點(diǎn)。
B,H,F,G的度為0,即B,H,F,G稱為葉子結(jié)點(diǎn)。度不為0的結(jié)點(diǎn)稱為非終端結(jié)點(diǎn)或分支結(jié)點(diǎn)。
如A,C,D,E。樹(shù)的度是樹(shù)內(nèi)各結(jié)點(diǎn)的度的最大值。
A的度為3,在所有結(jié)點(diǎn)中式最大的,即樹(shù)的度就是3。結(jié)點(diǎn)的子樹(shù)的根稱為該結(jié)點(diǎn)的孩子,相應(yīng)的,該結(jié)點(diǎn)稱為孩子的雙親。
結(jié)點(diǎn)H是結(jié)點(diǎn)E的孩子結(jié)點(diǎn),反之,E是H的雙親結(jié)點(diǎn)。同一個(gè)雙親的孩子之間互稱為兄弟。
E和F互為兄弟。結(jié)點(diǎn)的祖先是從根到該結(jié)點(diǎn)所經(jīng)分支上的所有結(jié)點(diǎn),反之,以某結(jié)點(diǎn)的根的子樹(shù)中的任一結(jié)點(diǎn)都稱為該結(jié)點(diǎn)的子孫。
H的祖先是A,C,E。 C的子孫是E,F,H。結(jié)點(diǎn)的層次從根開(kāi)始定義起,根為第一層,根的孩子為第二層。若某結(jié)點(diǎn)在第 l 層,則其子樹(shù)的根就在第 l + 1 層。其雙親在同一層的結(jié)點(diǎn)互稱為堂兄弟。樹(shù)中結(jié)點(diǎn)的最大層次稱為樹(shù)的深度或高度。
圖中樹(shù)的深度為3。如果將樹(shù)中結(jié)點(diǎn)的各子樹(shù)看成從左至右是有序次的(即不能互換),則稱該樹(shù)為有序樹(shù),否則稱為無(wú)序樹(shù)。
二. 樹(shù)的存儲(chǔ)結(jié)構(gòu)
(一). 雙親表示法
這種存儲(chǔ)結(jié)構(gòu)是一種順序存儲(chǔ)結(jié)構(gòu),用一組連續(xù)空間存儲(chǔ)樹(shù)的所有結(jié)點(diǎn),同時(shí)在每個(gè)結(jié)點(diǎn)中附設(shè)一個(gè)下標(biāo)(偽指針)指示其雙親結(jié)點(diǎn)的位置。結(jié)點(diǎn)結(jié)構(gòu)表示為:
data值就是結(jié)點(diǎn)的數(shù)據(jù)值,parent表示這個(gè)數(shù)據(jù)結(jié)點(diǎn)的雙親結(jié)點(diǎn)在這個(gè)空間中存放的位置。如
可表示為:
因?yàn)閜arent指向雙親的位置,并沒(méi)有指向孩子結(jié)點(diǎn)的指針,因此使用雙親表示法找出雙親結(jié)點(diǎn)的時(shí)間復(fù)雜度為O(1),找出孩子結(jié)點(diǎn)必須要全部遍歷一遍,時(shí)間復(fù)雜度為O(n)。雙親存儲(chǔ)結(jié)構(gòu)的類型聲明:
#define MAX_TREE_SIZE 100struct PTNode
{TElem Type data
;int parent
;
};struct PTree
{PTNode nodes
[MAX_TREE_SIZE
];int r
,n
;
};
(二). 孩子表示法
由于樹(shù)中每個(gè)結(jié)點(diǎn)可能有多棵子樹(shù),則可用多重鏈表,即每個(gè)結(jié)點(diǎn)有多個(gè)指針域,其中每個(gè)指針指向一棵子樹(shù)的根節(jié)點(diǎn),此時(shí)鏈表中的結(jié)點(diǎn)可以有如下兩種結(jié)點(diǎn)格式:
1. 定長(zhǎng)結(jié)點(diǎn)鏈表存儲(chǔ)結(jié)構(gòu)
孩子鏈表存儲(chǔ)結(jié)構(gòu)可按樹(shù)的度設(shè)計(jì)結(jié)點(diǎn)的孩子結(jié)點(diǎn)指針域個(gè)數(shù)
2. 孩子鏈表存儲(chǔ)結(jié)構(gòu)
把每個(gè)結(jié)點(diǎn)的孩子結(jié)點(diǎn)排列起來(lái),看成是一個(gè)線性表,且以單鏈表作存儲(chǔ)結(jié)構(gòu),則n個(gè)結(jié)點(diǎn)有n個(gè)孩子鏈表(葉子的孩子鏈表為空表)。
而n個(gè)頭指針又組成一個(gè)線性表,為了便于查找,可采用順序存儲(chǔ)結(jié)構(gòu)。如下圖:
為此,需要設(shè)計(jì)兩種結(jié)點(diǎn)結(jié)構(gòu):
樹(shù)的孩子鏈表孩子兄弟表示:
typedef struct CTNode
{ struct CTNode
*next
;int child
;
};typedef struct{TElem data
;ChildPtr firstchild
;
}CTBox
; typedef struct {CTBox nodes
[MAX_TREE_SIZE
];int r
,n
;
}CTree
;
(三). 孩子兄弟表示法
又稱二叉樹(shù)表示法,或二叉鏈表表示法。以二叉鏈表作樹(shù)的存儲(chǔ)結(jié)構(gòu)。鏈表中結(jié)點(diǎn)的兩個(gè)鏈域分別指向該結(jié)點(diǎn)的第一個(gè)孩子結(jié)點(diǎn)和下一個(gè)兄弟結(jié)點(diǎn),分別命名為 firstchild域和 nextchild域。
樹(shù)的二叉鏈表(孩子—兄弟)存儲(chǔ)表示:
typedef struct CSNode
{TElemType data
;CSNode
*firstchild
, *nextchild
;
}CSNode
*CSTree
;
總結(jié)
以上是生活随笔為你收集整理的树的概念及存储结构(双亲表示法,孩子表示法,孩子兄弟表示法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。