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