---
title: 'Symmetric Min-Max Heap'
disqus: hackmd
---
[TOC]
## Symmetric Min-Max Heap (SMMH)
> [color=#34d2db] **Def:(此為新版的SMMH)**
> 1. 本身是 Complete Binary Tree
> 2. Root 無 Data
> 3. 任意 Node 之 Left Child Data $\leq$ Right Child Data
> 4. 任意 Node 之
> * Left Subtree (左子樹) 為 Min - Heap
> * Right Subtree (右子樹) 為 Max - Heap
> 5. 任意兄弟關係中 Left sibling (左兄弟) $\leq$ Right sibling (右兄弟)
>
```graphviz
graph graphname{
1 [label=""]
2 [label="4"]
3 [label="80"]
4 [label="8"]
5 [label="60"]
6 [label="6"]
7 [label="40"]
8 [label="12"]
9 [label="20"]
10 [label="10"]
11 [label="16"]
12 [label="14"]
13 [label="30"]
1--2
1--3
2--4
2--5
3--6
3--7
4--8
4--9
5--10
5--11
6--12
6--13
}
```
---
### Sibling Adjustment - 調整兄弟節點
* Left sibling (左兄弟) $\leq$ Right sibling (右兄弟)
```graphviz
graph graphname{
1 [label=""]
1--10
1--5
}
```
* 若不符合則交換,Swap(10,5)
```graphviz
graph graphname{
1 [label=""]
1--5
1--10
}
```
---
### Grandparent Adjustment - 調整父子節點
* 以 Node 20 舉例,通常要判斷 Parent 關係時我們只要取 $\lfloor\dfrac{index}{2}\rfloor$ 即可
但是別忘記還要保持 Parent 的兄弟關係,也就是 $\lfloor\dfrac{index}{2}\rfloor+1$ ( 紅Node )
```graphviz
graph graphname{
5[label="5"]
10[label="10" color=red]
1 [label=""]
1--5
1--10
5--20
}
```
* 你可以選擇上述的取法,或是直接 $\lfloor\dfrac{index}{4}\rfloor$ 取得 Grandparent 在找他的 Child
```graphviz
graph graphname{
5[label="5"]
10[label="10"]
1 [label="" color=blue]
1--5[color=red]
1--10[color=red]
5--20
}
```
* 左邊的 Parent 是 Min-Heap , $5\le20$ 成立
```graphviz
graph graphname{
5[label="5" color=blue]
10[label="10"]
20[label="20"color=blue]
1 [label=""]
1--5
1--10
5--20
}
```
* 右邊的 Parent 是 Max-Heap , $10\geq20$ 不成立
```graphviz
graph graphname{
5[label="5" ]
10[label="10" color=blue]
20[label="20"color=blue]
1 [label=""]
1--5
1--10
5--20
}
```
* 交換
```graphviz
graph graphname{
5[label="5" ]
10[label="10"]
20[label="20" color=blue]
1 [label=""]
1--5
1--20
5--10
}
```
---
### Insertion - 插入
* 只要運用上面兩個條件就能實現插入的功能
* 根據 Complete Binary Tree 性質將新 Node 2 放置第 n+1 位置 ( n = nodes )
```graphviz
graph graphname{
1 [label=""]
2 [label="4"]
3 [label="80"]
4 [label="8"]
5 [label="60"]
6 [label="6"]
7 [label="40"]
8 [label="12"]
9 [label="20"]
10 [label="10"]
11 [label="16"]
12 [label="14"]
13 [label="30"]
14 [label="2" color=red]
1--2
1--3
2--4
2--5
3--6
3--7
4--8
4--9
5--10
5--11
6--12
6--13
7--14
}
```
* 因為沒有 Sibling 所以直接判斷 Parent:40 > 2 成立
```graphviz
graph graphname{
1 [label=""]
2 [label="4"]
3 [label="80"]
4 [label="8"]
5 [label="60"]
6 [label="6"]
7 [label="40"]
8 [label="12"]
9 [label="20"]
10 [label="10"]
11 [label="16"]
12 [label="14"]
13 [label="30"]
14 [label="2" color=red]
1--2
1--3
2--4
2--5
3--6
3--7
4--8
4--9
5--10
5--11
6--12
6--13
7--14
}
```
* 6 > 2 不符合 Min-Heap 定義,交換
```graphviz
graph graphname{
1 [label=""]
2 [label="4"]
3 [label="80"]
4 [label="8"]
5 [label="60"]
6 [label="2" color=red]
7 [label="40"]
8 [label="12"]
9 [label="20"]
10 [label="10"]
11 [label="16"]
12 [label="14"]
13 [label="30"]
14 [label="6"]
1--2
1--3
2--4
2--5
3--6
3--7
4--8
4--9
5--10
5--11
6--12
6--13
7--14
}
```
* 4 > 2 不符合 Min-Heap 定義,交換
```graphviz
graph graphname{
1 [label=""]
2 [label="2" color=red]
3 [label="80"]
4 [label="8"]
5 [label="60"]
6 [label="4"]
7 [label="40"]
8 [label="12"]
9 [label="20"]
10 [label="10"]
11 [label="16"]
12 [label="14"]
13 [label="30"]
14 [label="6"]
1--2
1--3
2--4
2--5
3--6
3--7
4--8
4--9
5--10
5--11
6--12
6--13
7--14
}
```
:::warning
**Time Complexity:O(log~n~)**
:::
---
### Deletion - 刪除
* 同一般 Heap 從 Root 刪除,因為 Root 分成 Max/Min - Heap 我們可以選擇
1. Min Deletion ( Left Subtree )
2. Max Deletion ( Right Subtree )
* 因為現在是改變 Parent 所以檢查完 Sibling 之後改成檢查 Grandchild 重複此循環下去直到 Leaf 即可
```graphviz
graph graphname{
1 [label=""]
2 [label="2"]
3 [label="80"]
4 [label="8"]
5 [label="60"]
6 [label="4"]
7 [label="50"]
8 [label="12"]
9 [label="20"]
10 [label="10"]
11 [label="16"]
12 [label="14"]
13 [label="30"]
14 [label="6"]
15[label="40"]
1--2
1--3
2--4
2--5
3--6
3--7
4--8
4--9
5--10
5--11
6--12
6--13
7--14
7--15
}
```
* 移除 2
```graphviz
graph graphname{
1 [label=""]
2 [label="" color=red]
3 [label="80"]
4 [label="8"]
5 [label="60"]
6 [label="4"]
7 [label="50"]
8 [label="12"]
9 [label="20"]
10 [label="10"]
11 [label="16"]
12 [label="14"]
13 [label="30"]
14 [label="6"]
15[label="40"]
1--2
1--3
2--4
2--5
3--6
3--7
4--8
4--9
5--10
5--11
6--12
6--13
7--14
7--15
}
```
* 將 Last Node 補進去,判斷 Sibling 40 < 80 成立
```graphviz
graph graphname{
1 [label=""]
2 [label="40" color=red]
3 [label="80"]
4 [label="8"]
5 [label="60"]
6 [label="4"]
7 [label="50"]
8 [label="12"]
9 [label="20"]
10 [label="10"]
11 [label="16"]
12 [label="14"]
13 [label="30"]
14 [label="6"]
1--2
1--3
2--4
2--5
3--6
3--7
4--8
4--9
5--10
5--11
6--12
6--13
7--14
}
```
* 判斷 Grandchild 中最小值
```graphviz
graph graphname{
1 [label=""]
2 [label="40" color=red]
3 [label="80"]
4 [label="8" color=blue]
5 [label="60"]
6 [label="4" color=blue]
7 [label="50"]
8 [label="12"]
9 [label="20"]
10 [label="10"]
11 [label="16"]
12 [label="14"]
13 [label="30"]
14 [label="6"]
1--2
1--3
2--4
2--5
3--6
3--7
4--8
4--9
5--10
5--11
6--12
6--13
7--14
}
```
* 與 4 交換,判斷 Sibling 成立
```graphviz
graph graphname{
1 [label=""]
2 [label="4" color=blue]
3 [label="80"]
4 [label="8"]
5 [label="60"]
6 [label="40" color=red]
7 [label="50"]
8 [label="12"]
9 [label="20"]
10 [label="10"]
11 [label="16"]
12 [label="14"]
13 [label="30"]
14 [label="6"]
1--2
1--3
2--4
2--5
3--6
3--7
4--8
4--9
5--10
5--11
6--12
6--13
7--14
}
```
* 判斷 Grandchild 中最小值
```graphviz
graph graphname{
1 [label=""]
2 [label="4"]
3 [label="80"]
4 [label="8"]
5 [label="60"]
6 [label="40" color=red]
7 [label="50"]
8 [label="12"]
9 [label="20"]
10 [label="10"]
11 [label="16"]
12 [label="14" color=blue]
13 [label="30"]
14 [label="6" color=blue]
1--2
1--3
2--4
2--5
3--6
3--7
4--8
4--9
5--10
5--11
6--12
6--13
7--14
}
```
* 與 6 交換,到達 Leaf 結束
```graphviz
graph graphname{
1 [label=""]
2 [label="4"]
3 [label="80"]
4 [label="8"]
5 [label="60"]
6 [label="6" color=blue]
7 [label="50"]
8 [label="12"]
9 [label="20"]
10 [label="10"]
11 [label="16"]
12 [label="14"]
13 [label="30"]
14 [label="40" color=red]
1--2
1--3
2--4
2--5
3--6
3--7
4--8
4--9
5--10
5--11
6--12
6--13
7--14
}
```
#### Min Deletion
* 同上步驟,將 Right 改為 Left 即可
###### tags: `Data Structure`