- 樹是一種遞歸數據結構,包含一個或多個數據節點的集合,其中一個節點被指定為樹的根,而其餘節點被稱為根的子節點。
- 除根節點之外的節點被劃分為非空集,其中每個節點將被稱為子樹。
- 樹的節點要麼保持它們之間的父子關係,要麼它們是姐妹節點。
- 在通用樹中,一個節點可以具有任意數量的子節點,但它只能有一個父節點。
- 下圖顯示了一棵樹,其中節點
A
是樹的根節點,而其他節點可以看作是A
的子節點。
基本術語
- 根節點 : 根節點是樹層次結構中的最頂層節點。 換句話說,根節點是沒有任何父節點的節點。
- 子樹: 如果根節點不為空,則樹
T1
,T2
和T3
稱為根節點的子樹。 - 葉節點: 樹的節點,沒有任何子節點,稱為葉節點。 葉節點是樹的最底部節點。 一般樹中可以存在任意數量的葉節點。 葉節點也可以稱為外部節點。
- 路徑: 連續邊的序列稱為路徑。 在上圖所示的樹中,節點
E
的路徑為A→B→E
。 - 祖先節點: 節點的祖先是從根到該節點的路徑上的任何前節點。根節點沒有祖先節點。 在上圖所示的樹中,節點
F
的祖先是B
和A
。 - 度: 節點的度數等於子節點數,節點數。 在上圖所示的樹中,節點
B
的度數為2
。葉子節點的度數總是0
,而在完整的二叉樹中,每個節點的度數等於2
。 - 級別編號: 為樹的每個節點分配一個級別編號,使得每個節點都存在於高於其父級的一個級別。樹的根節點始終是級別
0
。
樹的靜態表示
#define MAXNODE 500
struct treenode {
int root;
int father;
int son;
int next;
}
樹的動態表示
struct treenode
{
int root;
struct treenode *father;
struct treenode *son
struct treenode *next;
}
樹的類型
樹數據結構可以分為六個不同的類別。
1.一般樹
一般樹(General Tree)按層次順序存儲元素,其中頂級元素始終以0
級作為根元素。 除根節點之外的所有節點都以級別數存在。 存在於同一級別的節點稱為兄弟節點,而存在於不同級別的節點表現出它們之間的父子關係。 節點可以包含任意數量的子樹。 每個節點包含3
個子樹的樹稱為三元樹。
2.森林
可以將森林(Forests)定義為可以通過刪除根節點並將根節點連接到第一級節點的邊緣來獲得的不相交樹的集合。
3.二叉樹
二叉樹是一種數據結構,其中每個節點最多可以有2
個子節點。 存在於最頂層的節點稱為根節點。 具有0
個子節點的節點稱為葉節點。 二叉樹用於運算式評估等應用程式。 我們將在本教學後面詳細討論二叉樹。
4.二叉搜索樹
二叉搜索樹是有序二叉樹。 左子樹中的所有元素都小於根,而右子樹中存在的元素大於或等於根節點元素。 二進位搜索樹用於電腦科學領域的大多數應用,如搜索,排序等。
5.表達樹
運算式樹用於評估簡單的算術運算式。運算式樹基本上是二叉樹,其中內部節點由運算符表示,而葉節點由運算元表示。運算式樹被廣泛用於解決代數運算式,如(a + b)*(a-b)
。 請考慮以下示例。
使用以下代數運算式構造運算式樹:
(a + b) / (a*b - c) + d
6.競賽樹
競賽樹用於記錄兩名比賽者之間每輪比賽的勝者。 比賽樹也可以稱為選擇樹或獲勝者樹。 外部節點表示正在播放匹配的比賽者,而內部節點表示所播放的匹配的勝者。 在最頂層,比賽的獲勝者作為樹的根節點出現。
例如,在4個比賽者之間進行的比賽樹如下所示。 但是,左子樹中的獲勝者將與右子樹的獲勝者對戰。