Min-Max Heap
Def
- 一種Complete B.T.
- Min-level Max-level交錯
- Root為min-level
- 若Node X為 Min-level 代表以X為Root的子樹中,X最小
- 若Node X為 Max-level 代表以X為Root的子樹中,X最大
- 操作
- Insert X
- 將X置於 last Node的下一個
- X的parent P
- Case:
- X位於 Min-level
X.val < P.val
- 挑戰上面的Min-level
X.val > P.val
Swap(X,P)
- 挑戰上面的Max-level
- X位於 Max-level
X.val > P.val
- 挑戰上面的Max-level
X.val > P.val
Swap(X,P)
- 挑戰上面的Min-level
- X位於 Min-level
- Delete Max
- Delete Min
- 移除Root
- 刪除Last Node X
- X插入Root
- Case
-
X 無child 停止
-
Root之子孫中Min出現在Root的左右子點
- 找出child中最小值 k
1 2 3 4
if k.val < X.val { Swap(k,X) } exit
- 找出child中最小值 k
-
Root之子孫中Min出現在Root的孫子
- 找出grandchild中最小 k ,p為k之parent
1 2 3 4 5 6 7 8
if k.val < X.val { //與 min-level 比較 Swap(X,k) if X.val > p.val {// 換下去之後要跟 max-level 比較 Swap_val(X,p) } //以K的原位作為ROOT再次判斷case goto(Switch) }
-
- Insert X
Deap
Def
- Complete B.T.
- Dummy Root(No Data)
- Root 左子樹為Min-Heap
- Root 右子樹為Max-Heap
- 若i為Min-Heap中某Node,令j為i在Max-Heap中對應的Node,則
Deap[i]<=Deap[j]
$j=i+(i 的上一層最多Node數)$
$=i+2^{(i的level - 1)}-1$
$=i+2^{(i的level - 2)}$
求i的level
$2^{(k-1)}=i$
$k=\lceil log_2{(i+1)}\rceil$
- 操作
- Insert X
- 將X置於Last Node的下一個位置
- Case:
-
X在 Min-Heap j為其在 Max-Heap對應位置
1 2 3 4 5 6
if x > Deap[j]{ Deap[n]=Deap[j] MAX-Heap-Insert(Deap,j,X) } else { Min-Heap-Insert(Deap,n,x) }
-
X在 Max-Heap j為其在 Min-Heap對應位置
if x < Deap[j]{ Deap[n]=Deap[j] Min-Heap-Insert(Deap,j,X) } else { Max-Heap-Insert(Deap,n,x) }
-
- Delete min
- 移除左子樹Root
- 刪除Last Node X
- 左子樹Root的空格,由子點min{Ltree,Rtree}向上遞補
- Insert X
- Insert X
SMMH(Symmetric Min-Max Heap)
Def
- Complete B.T. & Dummy Root
Left Sibling <= Right Sibling
- 若 node X 有Grandparent 則Grandparent的Left child<=X
- 則Grandparent的Right child>=X
- 操作
- Insert X
- 置於Last Node的下一個位置
- 按照Policy 1 調整
- 按照Policy 2 & 3 調整
- Delete Min
- 移除左子樹的Root
- 刪除Last Node X
- 將X置入左子樹的Root,按照Policy 2 調整樹
- 按照Policy 1驗證樹
- Insert X