Chapter 6 樹狀結構 二元樹 引線二元樹 - Ian-Liu-1990/Data-Structure GitHub Wiki
1. 樹的專有名詞
-
祖先(ancestor): 由樹根至某節點的路徑上經過的所有節點,皆是該節點的祖先(不包含節點本身)
-
後代(descendant): 由一節點至某樹葉的路徑上經過的所有節點,皆為該節點的後代(不包含節點本身)
-
葉節點: 沒有子節點
-
分支度: 某一節點(Root不代表全部節點)擁有的節點數
-
階層(Level)[文字遊戲考題]
- 定義樹的世代關係,一代為一階度,此種定義樹根階層為1
- 定義樹根到節點的路徑長度,此種定義樹根階層為0
-
高度(Height)[階層定義影響高度]
- 第一種定義樹的世代關係,一代為一階度, 此種定義樹根階層為1,找樹葉節點是最大階層
- 第二種節點到樹葉的最長路徑長度,此種定義樹根階層為0,找樹葉節點是最大階層
-
深度(depth): 高度又稱為深度[文字遊戲]
-
樹林: N個互斥樹組成, 移去樹根(Root)即為樹林
-
樹的結構表示法: P6-3(Root, (Node1, Node2, ...)), 註Node1和Node2同為兄弟
2. 二元樹
- 定義 : 有限集合,可以是一顆空的樹,非空則由樹根+左子樹,樹根,右子樹所組成,樹根+左右子樹,且左右子樹也都是二元樹.
特性 | 二元樹 | 一般樹 |
---|---|---|
節點個數 | 0<= | 1<= |
排列序 | 有排列 | 無排列 |
分支度大小 | <=2 | 無上限 |
二元樹特點公式,b二元樹的總分支度,ni代表該分之度為i的節點數
A.- b = n - 1 : 總分支度 = 總節點數 - 1
- n = n0 + n1 + n2 : 總節點數 = 葉子數 + 分支度為1的節點數 + 分支度為2的節點數
- b = n1 + 2n2
- n0 = n2 + 1
- 在第i高度上,節點數最多 2^(i-1)
- N個節點的二元樹,共有幾顆 : 塔卡蘭數: C(2n, n) / (n+1)
完滿二元樹
C.- 定義 : 高(階)度等於K,必須要等於(2^k)-1個節點數, k>=1, 此公式只適用根節點高(階)度為1
完整二元樹
D.- 定義: 高(階)度等於K,節點數在(2^k-1)與(2^k)-1之間, k>=1, 此公式只適用根節點高(階)度為1 且節點排列順序必須等同完滿二元樹
- 題目 : 若一個完全二元樹(complete binary tree)的最底層有 n 個節點,則此樹最少的總節點數為多少?
解: 假設樹高H,則形成完全二元樹,(2^H-1)在加1 = n,則H-1要是完滿,H-1的總節點數就是n-1,n+n-1 = 2n-1
歪斜樹
E.- 定義 : 樹高為最高,n個節點則樹高 = n,反過來說,若為歪斜樹高為n最多節點數也為n
-
[王八蛋]考試應看給二元樹是給"樹根" 的 "高度": 是0還是1
-
題目: 假若二元樹中每一個節點都可存放一筆資料,若需利用此種樹存放 700 筆資料,則從根(root)節點算起為 第 1 層,根節點的子節點則為第 2 層,以此類推,此樹最少需建至第幾層才能存放所有的資料?
F. 二元樹表示法
G. 二元樹的追蹤
- 中序:左子樹->樹根->右子樹
void inorder(Node_type *tree){
if( tree != Null){
inorder(tree->Llink);
printf("%d", tree->data);
inorder(tree->RLink);
}
}
- 前序:樹根->左子樹->右子樹
void preorder(Node_type *tree){
if(tree != null){
printf("%d", tree->data);
preorder(tree->Llink);
preorder(tree->Rlink);
}
}
- 後序:左子樹->右子樹->樹根
void postorder(Node_type *tree)
{
if(tree != Null){
postorder(tree->Llink);
postorder(tree->Rlink);
printf("%d", tree->data);
}
}
H. 引線二元樹
-
定義 : 一個二元樹通過如下的方法「串起來」:所有原本為空的右子指針改為指向該節點在中序序列後繼者,所有原本為空的左(孩子)指針改為指向該節點的中序序列前行者。
-
特性 : 一棵N個節點的二元樹,則會有N+1個空指標,會有N+1個引線數
-
優點 :
- 簡化中序追蹤
- 不須利用Stack來得到中序式
- 充分利用Link剩餘的空間
-
組成
LBIT0/1 | LLINK | DATA | RLINK | RBIT0/1 |
---|
I. 一般樹轉二元樹
J. 森林轉二元樹
序列轉二元樹
步驟演算法
決定唯一的二元樹
- 給中序+前序 推 後序
- 給中序+後序 推 前序
算式樹 - 可以出的很難
-
定義 : 為一二元樹,若非空則ROOT可為運算元且左右子樹皆為空,否則ROOT為運算子且左右子樹皆為非空運算樹
-
給一中序轉算式樹 : 要先求得後序,再由中序 + 後序決定唯一樹
-
例 : -a+b/(c-d)-a*b/c+d轉算式樹