树的定义与存储
樹的定義
樹(tree):n(n>=0)個(gè)結(jié)點(diǎn)的有限集T。
n=0 則稱為空樹。
當(dāng)n>0時(shí),有且僅有一個(gè)特定的結(jié)點(diǎn),稱為樹的根(root)。
當(dāng)n>1時(shí),其余結(jié)點(diǎn)可分為m(m>=0)個(gè)互不相交的有限集T1,T2,..Tm,其中每一個(gè)和本身又是一棵樹,稱為根的子樹(subtree)。
?
??? ①
╱ │ ╲
② ④ ③
樹與非樹識(shí)別
除了根結(jié)點(diǎn)外,每個(gè)結(jié)點(diǎn)有且僅有一個(gè)父結(jié)點(diǎn)。
一個(gè)N個(gè)結(jié)點(diǎn)的樹,共有N-1條邊。
?
樹的基本術(shù)語
結(jié)點(diǎn)(node)--表示樹中的元素,包含數(shù)據(jù)元素及若干指向其子樹的分支。
結(jié)點(diǎn)的度(degree)--結(jié)點(diǎn)擁有的子樹數(shù)。
葉子(leaf)或終端結(jié)點(diǎn)--度為0的結(jié)點(diǎn)。
分支結(jié)點(diǎn)--度不為0的結(jié)點(diǎn)。
樹的度--一棵樹中最大的結(jié)點(diǎn)度數(shù)。
孩子(child)--結(jié)點(diǎn)子樹的根稱為該結(jié)點(diǎn)的孩子。
雙親(parents)--孩子結(jié)點(diǎn)的上層結(jié)點(diǎn)叫該結(jié)點(diǎn)的雙親。
兄弟(sibling)--同一雙親的孩子。
祖先結(jié)點(diǎn)--從根節(jié)點(diǎn)到該結(jié)點(diǎn)路徑上所有結(jié)點(diǎn)。
子孫結(jié)點(diǎn)--一個(gè)結(jié)點(diǎn)的直接后繼和間接后繼。
結(jié)點(diǎn)的層次(level)--從根節(jié)點(diǎn)算起,根為第一層,它的孩子為第二層...
深度(depth)--樹中節(jié)點(diǎn)的最大層次數(shù)。
?
A
╱ │ ╲
B ? C ? D
? ? ? ╱ ╲
E F
?? │
? G
?
樹的度和結(jié)點(diǎn)數(shù)的關(guān)系
樹中結(jié)點(diǎn)數(shù)=總分叉數(shù)+1. (分叉數(shù)就是所有結(jié)點(diǎn)的度之和,也是指:邊+1)
n0+n1+n2+n3+n4 = n1*1 +n2*2+n3*3+n4*4 +1?????? (n1表示度為1的結(jié)點(diǎn)數(shù),下例中n1的值為:4)
葉子的度數(shù)為0
設(shè)數(shù)T的度為4,其中度為1,2,3,4的節(jié)點(diǎn)個(gè)數(shù)分別為4,2,1,1 則T中的葉子數(shù)為多少?
解:
葉子的度數(shù)為0,設(shè)葉子的個(gè)數(shù)為x;
樹的總分叉數(shù)為:1*4+2*2+3*1+4*1=15
此樹的結(jié)點(diǎn)數(shù)為:16?? (15+1)
得出式子:4+2+1+1+x=16
得到:x=8
T中的葉子數(shù)為8。
?
?
樹型結(jié)構(gòu)與線性結(jié)構(gòu)
線性結(jié)構(gòu):
第一個(gè)數(shù)據(jù)元素(無前驅(qū))
最后一個(gè)數(shù)據(jù)元素(無后繼)
其他數(shù)據(jù)元素(一個(gè)前驅(qū)、一個(gè)后繼)
?
樹型結(jié)構(gòu)(非線性結(jié)構(gòu)):
根結(jié)點(diǎn)(無前驅(qū))
多個(gè)葉子結(jié)點(diǎn)(無后繼)
其他數(shù)據(jù)元素(一個(gè)前驅(qū)、多個(gè)后繼)
?
如何表示樹中元素間的關(guān)系?
A
╱ │ ╲
B ? C ? D
? ? ? ╱ ╲
E F
?? │
? G
雙親表示法
data parent
0 A -1
1 B 0
2 C 0
3 D 0
4 E 2
5 F 2
6 G 5
樹的存儲(chǔ)結(jié)構(gòu)-孩子表示法
孩子鏈表:每個(gè)結(jié)點(diǎn)的孩子結(jié)點(diǎn)用單鏈表存儲(chǔ),再用含n個(gè)元素的結(jié)構(gòu)數(shù)組指向每個(gè)孩子鏈表。
A
╱ ╲
B ?? C ?
? ╱ ? ╲ ╲
D ??? E ????? F
╱? ?? │?? ╲
G H????? I
?
| data | fc? ?? | ? | |||||||
| 0 | ? | ? | ? | ? | ? | ? | ? | ? | ? |
| 1 | A | → | 2 | → | 3 | ^ | ? | ? | ? |
| 2 | B | → | 4 | → | 5 | ^ | ? | ? | ? |
| 3 | C | → | 6 | ^ | ? | ? | ? | ? | ? |
| 4 | D | ^ | ? | ? | ? | ? | ? | ? | ? |
| 5 | E | → | 7 | → | 8 | → | 9 | ^ | ? |
| 6 | F | ^ | ? | ? | ? | ? | ? | ? | ? |
| 7 | G | ^ | ? | ? | ? | ? | ? | ? | ? |
| 8 | H | ^ | ? | ? | ? | ? | ? | ? | ? |
| 9 | I | ^ | ? | ? | ? | ? | ? | ? | ? |
帶雙親的孩子鏈表
| data | parent | fc? ?? | ? | |||||||
| 1 | A | 0 | → | 2 | → | 3 | ^ | ? | ? | ? |
| 2 | B | 1 | → | 4 | → | 5 | ^ | ? | ? | ? |
| 3 | C | 1 | → | 6 | ^ | ? | ? | ? | ? | ? |
| 4 | D | 2 | ^ | ? | ? | ? | ? | ? | ? | ? |
| 5 | E | 2 | → | 7 | → | 8 | → | 9 | ^ | ? |
| 6 | F | 3 | ^ | ? | ? | ? | ? | ? | ? | ? |
| 7 | G | 5 | ^ | ? | ? | ? | ? | ? | ? | ? |
| 8 | H | 5 | ^ | ? | ? | ? | ? | ? | ? | ? |
| 9 | I | 5 | ^ | ? | ? | ? | ? | ? | ? | ? |
?
樹的存儲(chǔ)結(jié)構(gòu)-孩子兄弟表示法
實(shí)現(xiàn):設(shè)計(jì)統(tǒng)一的結(jié)點(diǎn)結(jié)構(gòu),每個(gè)節(jié)點(diǎn)的兩個(gè)指針域分別指向其第一個(gè)孩子結(jié)點(diǎn)和下一個(gè)兄弟結(jié)點(diǎn)。
^ A ^ 其中兩個(gè)指針
特點(diǎn):
操作容易
空間浪費(fèi)少
| ↙ | A | |||||||||||
| ? | ? | ↓ | ?B | ?→ | ?↓ | ?C | ?^ | ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ? | ^ | F | ?^ | ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? |
| ? | ^ | D | → | ↓ | E | ^ | ? | ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ↓ | ? | ? | ? | ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ?^ | ?G | ?→ | ?^ | ?H | ?→ | ^ | I | ^ |
| ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? |
?
typedef struct SCNode
{ ElemType data;
struct SCNode *firstchild, *nextsibling;
}CSNode,*CSTree;
?
向右旋轉(zhuǎn)45o得到一棵樹,二叉樹。
每個(gè)結(jié)點(diǎn)至多只有二棵子樹并且子樹有左右之分,其次序不能任意顛倒的樹稱為二叉樹。
?
轉(zhuǎn)載于:https://www.cnblogs.com/privilege/p/11184628.html
總結(jié)
- 上一篇: white-space详解
- 下一篇: Jmeter_简单的关联设置