--- title: 'Binary Tree' disqus: hackmd --- [TOC] Binary Tree === * 又稱為 Knuth Tree , Ordered Tree * 有限集合,**可以為空** * 若非空則由 左子樹、右子樹 構成 * 每個 Node 之 Degree:0~2 * 子樹 有**次序**之分 #### 次序 1. 子樹 B,C 在 Tree 中視為相同 2. 在 Binary Tree 中視為不同 ![](https://i.imgur.com/411Dhi6.png) --- ## Difference with Tree | | Tree | Binary Tree | |:------:|:-----------:|:------:| | 可否為空 | $No$ , 至少一樹根 | $Yes$ | | $Node Degree$ (存在 $Root$ 時) | $\geq 0$ | $0,1,2$ | --- ## Three Theories of Binary Tree ### [定理一] 第 i Level 最多 $Node$ 數 > [color=#52d356]**Def : 高度起始點為 1** **Formula**:$2^{i-1}\ ,i\geq1$ :::warning #### 證明方式:數學歸納法 ::: > [color=#52d356]**Def : 高度起始點為 0** **Formula**:$2^i\ ,i\geq0$ :::success #### 證明方式:數學歸納法 ::: --- ### [定理二] Height 為 k 的最多 Node 數 (整棵樹) > [color=#52d356]**Def : 高度起始點為 $1$** > **Formula**:$2^k-1\ , \ k\geq1$ :::warning #### 根據定理一:2^0^ + 2^1^ + ... + 2^k-1^ 從 Level 1 依序累加至 Level k #### 根據等比級數 = $\frac{2^k-2^0}{2-1}$ #### = $2^k-1$ ::: > [color=#52d356]**Def : 高度起始點為 $0$** > **Formula**:$2^{(k+1)}-1\ , \ k\geq0$ :::success #### 根據定理一:$2^0 + 2^1 +\ ...\ + 2^k$ 從 $Level\ 0$ 依序累加至 $Level\ \ k$ #### 根據等比級數 $=\frac{2^{(k+1)}-2^0}{2-1}$ #### = $2^{(k+1)}-1$ ::: **藉由上述定理我們可以對 Node 數取 log 反推回高度** ![](https://i.imgur.com/BTzlrMA.png) --- ### [定理三] Branch(Degree) 與 Node 關係 * Leaf 數 = L (綠色node) * Branch 數 = B (藍、紅 Degree) * Nodes 數 = N * Degree 為 1 的 Nodes = d~1~ (藍色node) * Degree 為 2 的 Nodes = d~2~ (紅色node) ```graphviz digraph graphname{ 1 [label="Root" color=red]; 2 [label="A" color=red]; 3 [label="B" color=blue]; 4 [label="C" color=blue]; 5 [label="leaf" color = green ]; 6 [label="leaf" color = green ]; 7 [label="Null" style=dashed] 8 [label="leaf" color = green ]; 9 [label="Null" style=dashed] 10 [label="Null" style=dashed] 11 [label="Null" style=dashed] 12 [label="Null" style=dashed] 13 [label="Null" style=dashed] 15 [label="Null" style=dashed] 16 [label="Null" style=dashed] 1 -> 2 [color=red] 1 -> 3 [color=red] 2 -> 4 [color=red] 2 -> 5 [color=red] 3 -> 6 [color=blue] 3 -> 7 [style=dashed] 4 -> 8 [color=blue] 4 -> 9 [style=dashed] 5 -> 10[style=dashed] 5 -> 11[style=dashed] 6 -> 12[style=dashed] 6 -> 13[style=dashed] 8 -> 15[style=dashed] 8 -> 16[style=dashed] } ``` :::info 在上述圖例得知 1. <font color=red>$L + d_1~ + d_2 = Node$ 總數 </font> 2. 二元樹中 Degree 為 0~2 ( 之後的 m-way Tree 同理 ) Degree 為 1 的 Node 有 1 個 Branch Degree 為 2 的 Node 有 2 個 Branch 而 <font color=red>$(Branch$ $數)$ $+ 1 = Node$ 總數 </font> 所以 $(1 * d_1 + 2 * d_2) +1 = Node$ 總數 3. 藉由上述兩公式我們可以整理出 $L + d_1 + d_2 = Node總數 = d_1 + 2d_2 + 1$ <font color=red>$L = d_2 + 1$ </font> $(\ 樹葉 = Degree\ 為\ 2\ 的\ Nodes + 1\ )$ ::: --- 整理一下目前有的公式 :::warning * **Def : 高度起始點為 1** 1. 第 i Level 最多 Node 數:**$2^{k-1}$** -----------**( 2的高度-1次方 )** 2. Height 為 k 的最多 Node 數:**$2^k-1$** ----**( 2的高度次方-1 )** 3. Node總數 = **$L + d_1 + d_2$** --------------**( 樹葉 + Deg1的Nodes + Deg2的Nodes )** 4. Node總數 = **( $1 * d_1 + 2 * d_2 ) + 1$** ----**( 1倍Deg1的Nodes + 2倍Deg2的Nodes +1 )** 5. Node總數 = **$Branch + 1$** ----------------**( 分支+1 )** 7. 樹葉 = **$d_2 + 1$** -----------------------------**( Deg2的Nodes+1 )** 8. Branch = 所有 Degree 合 ::: > [color=#deed3d]補充:針對 3. 4. 的設計題 某樹之 $Degree\ of\ tree = k$ ( 最大Degree 為k ) $Degree\ 為\ i$ 的 $Nodes$ 有 $i$ 個 ,$1\leq i \leq k$, 求 $Leaf$ 總數? > [color=#deed3d] > **Sol**: > 1. 根據 `3.` $Nodes = Deg-0$ 個數 $(Leaf) + Deg-1$ 個數 $+ ... + Deg-i$ 個數 > > 1. 從題目 <font color = red>$1\leq i \leq k$</font> 得 **$Nodes = Leaf + 1 + 2 + ... + k$** 根據等差級數 **$Nodes = Leaf\ +$** ![](https://i.imgur.com/pUskWyx.png =80x) > 2. 根據 `4.` **Nodes = ( 1 * d~1~ + 2 * d~2~ ) + 1** 從題目 <font color = red>$Degree\ 為\ i\ 的\ Nodes\ 有\ i\ 個$</font> 得 **( 1 * 1 + 2 * 2 + ... + k * k ) + 1** 根據平方合 **Nodes =** ![](https://i.imgur.com/LXxB0xH.png =200x) > 3. 移項即可得 **Leaf =** ![](https://i.imgur.com/6CENuph.png =300x) >[color=#deed3d] 關鍵字 Degree-0 (Leaf) , Degree-1 , Degree-2 , Height , Nodes , Branch 互通到熟練吧 --- ## Type of Binary Tree ### Skewed Tree - 斜曲樹 * 左斜曲:每個非樹葉節點只有左子點。 * 右斜曲:每個非樹葉節點只有右子點。 ![](https://2.bp.blogspot.com/-RTstVabugM8/WxeY8irVdFI/AAAAAAAAKPI/cuW2iFW48R80puK5er7Yw5ggdnsnWgiAwCLcBGAs/s1600/Algorithm_skewed_trees.jpg =600x) --- ### Complete Binary Tree * 由上至下由左而右依序填入 ![](https://i.imgur.com/CJYTt77.png) :::danger * **Def:編號 (Index) 起始點 1 , 某Node編號 = n** Left Child 編號 = **Parent 編號 * 2** Right Child 編號 = **Parent 編號 * 2 + 1** n's Parent 編號 = $\left \lceil \frac{(n-1)}{2} \right \rceil$ ::: :::success * **Def:編號 (Index) 起始點 0 , 某Node編號 = n** Left Child 編號 = **Parent 編號 * 2 + 1** Right Child 編號 = **Parent 編號 * 2 + 2** n's Parent 編號 = $\left \lfloor \frac{(n-1)}{2} \right \rfloor$ ::: > [color=#] 計算完請判斷該樹是否存在此節點 Parent , Child 編號關係證明:數學歸納法(略) :::info **Def:高度起始點 1** * 根據定理二得出 k Level 的最大 Node 總數 = $2^k-1$ * 根據 Complete Binary Tree 特性,若高度 $k$ ,則 $Nodes$ 必介於 $k$ 層第 $1$ 個:$(2^{k-1}-1)+1$ (藍色 Nodes) 到 $k$ 層最後一個 : $2^k-1$ $Nodes$ 之間 ::: ```graphviz digraph graphname{ 1 [label="Root" color=blue]; 2 [label="A" color=blue]; 3 [label="B" color=blue]; 4 [label="D" color=blue]; 5 [label="E" color=red style=dashed]; 6 [label="F" color=red style=dashed]; 7 [label="G" color=red style=dashed]; 1 -> 2 1 -> 3 [label=" 若 Level=3 則必含有藍Node"] 2 -> 4 2 -> 5 3 -> 6 3 -> 7 [label=" 紅 Node為 Level=3 Node總數合理範圍"] } ``` :::info * 因此我們得知,給定一 Complete Binary Tree $2^{k-1} \leq Nodes \leq 2^k-1$ ::: --- ### Strictly binary tree * 除了 Leaf 以外,每個 Node 都有兩個 Child。 * $Nodes = n_0+n_2$ > ![](https://qph.fs.quoracdn.net/main-qimg-d76b2da65e44dddcbf5321d767e0889a) --- ### Full Binary Tree * 長滿整棵樹,Nodes 等同定理二 ![](https://i.imgur.com/9CAmmqv.png) --- ## Binary Tree Representation in C ### Array > [color=#7ef466] **Def:編號 (Index) 起始點 1 , 高度 = k** > 1. 假設 k = 3 > 2. 建立一個 `int tree[]` 陣列,空間為:2^k^-1 = 8 = s > Index:0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 > 3. 若使用迴圈,終止條件為 > * i<2^k^-1 = 8-1 = s-1 > * i<=2^k^-2 = 8-2 = s-2 > 4. 存在情況下,設某點為 n > * Root = `tree[1]` > * n's Parent = `tree[n/2]` * 請注意程式語言對浮點數處理特性 > * n's Left Child = `tree[2*n]` > * n's Right Child = `tree[2*n+1]` ```graphviz digraph graphname{ 0 [label="tree[0]" color=red] 1 [label="tree[1]"] 2 [label="tree[2]"] 3 [label="tree[3]"] 4 [label="tree[4]"] 5 [label="tree[5]"] 6 [label="tree[6]"] 7 [label="tree[7]"] 1->2 1->3 2->4 2->5 3->6 3->7 } ``` --- > [color=#7ef466] **Def:編號 (Index) 起始點 0 , 高度 = k** > 1. 假設 k = 3 > 2. 建立一個 `int tree[]` 陣列,空間為:2^k+1^-1 = 8 = s > Index:0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 > 3. 若使用迴圈,終止條件為 > * i<2^k+1^-1 = 8-1 = s-1 > * i<=2^k+1^-2 = 8-2 = s-2 > 4. 存在情況下,設某點為 n > * Root = `tree[0]` > * n's Parent = `tree[(n-1)/2]` * 請注意程式語言對浮點數處理特性 > * n's Left Child = `tree[2*n+1]` > * n's Right Child = `tree[2*n+2]` ```graphviz digraph graphname{ 0 [label="tree[0]"] 1 [label="tree[1]"] 2 [label="tree[2]"] 3 [label="tree[3]"] 4 [label="tree[4]"] 5 [label="tree[5]"] 6 [label="tree[6]"] 7 [label="tree[7]" color=red] 0->1 0->2 1->3 1->4 2->5 2->6 } ``` :::success **優點:** 1. 容易存取左右 Child 2. 若 Perfect Binary Tree 則完美利用空間 **(Def:root start from index 0)** ::: :::danger **缺點:** 1. 插入、刪除 不便 2. Height 改變則需重新宣告新陣列 3. 對於 Skewed Binary Tree 極為浪費 **( Def:root start from index 0 , Height = k = Nodes , 2^k^-1-k 未使用)** ::: --- ### Linked List > [color=#7ef466] **Def:Nodes = n** > 1. Linked List 中的 Link 相當於定理所提到的 Branch > 而在程式當中每個 Node 結構都有兩條 Link,有別於定理中的觀念 > 我們會將指向 Null 的 Link 也一併算進去 (藍Link) > 實際上公式還是可行的,只要我們將 Null 也視為 Node > > 2. 不過我們想探討的是沒有使用到的 Link (藍Link) > 以下將 Branch 視為 Link > > 3. Links = 所有 Degree 合 > 因為每一個 Node 皆有 2 個 Links > => **所有的 Links = 2*n** > 4. 根據定理 > **有使用到的 Links = n - 1** > > 5. 根據 `3.` ` 4.`得出 > =>所有的 Links - 有使用到的 Links = 未使用的 Links > => **(2 * n) - (n-1) = n+1** > > 6. 可以這樣記 `n-1 (未使用的LINK) -> n (Nodes) -> n+1 (使用的LINK)` ```graphviz digraph graphname{ 1 [label="Root"]; 2 [label="A"]; 3 [label="B"]; 4 [label="leaf"]; 5 [label="leaf"] 6 [label="leaf"] 7 [label="leaf"] 8 [label="Null" style=dashed]; 9 [label="Null" style=dashed] 10 [label="Null" style=dashed] 11 [label="Null" style=dashed] 12 [label="Null" style=dashed] 13 [label="Null" style=dashed] 14 [label="Null" style=dashed] 15 [label="Null" style=dashed] 1 -> 2 1 -> 3 2 -> 4 2 -> 5 3 -> 6 3 -> 7 4 -> 8 [color=blue] 4 -> 9 [color=blue] 5 -> 10[color=blue] 5 -> 11[color=blue] 6 -> 12[color=blue] 6 -> 13[color=blue] 7 -> 14[color=blue] 7 -> 15[color=blue] } ``` :::success **優點:** 1. Node 插入、刪除方便 2. 對於 Skewed Binary Tree 完美利用空間 ::: :::danger **缺點:** 1. 各 Node Parent 不好尋找 2. 幾乎有 $50\%\ Links$ 未使用到,即指向 $NULL$ 的 $Link$ **(因此延伸出了 [Threaded Binary Tree - 引線二元樹](https://hackmd.io/xmKt-0W7SMap59uIYg8-jw#Thread-Binary-Tree---%E5%BC%95%E7%B7%9A%E4%BA%8C%E5%85%83%E6%A8%B9))** ::: --- ## Binary Tree Traversal * to be continued --- ## Multiple Structures of One Binary Tree * 回憶一下,以下兩種結構的樹,如果是 Tree 那麼兩顆是一樣的,如果是 Binary Tree 則是不同的 * 此節探討的就是當 Binary Tree 具有 N Nodes (N $\geq$ 1),那麼這棵樹有幾種表示的方法,也就是他有幾種不同的結構 ![](https://i.imgur.com/Z5Qz4ld.png) --- ### Formula * $\dfrac{1}{n+1}$ $\left(\begin{array}{ccc}2n \\n\\\end{array}\right)$ * 給 3 Nodes 畫出所有的可能的 Binary Tree ![](https://i.imgur.com/ASN9vPC.png) * Solution:$\dfrac{1}{3+1}$ $\left(\begin{array}{ccc}2*3 \\3\\\end{array}\right)=5$ ## Proof to be continued p.194 --- ###### tags: `Data Structure`