j = i, izquierdo no vacío, derecho vacío → retornar el izquierdo).BSTree_Delete(
BSTree_Insert(
BSTree_Insert(
BSTree_Insert(
BSTree_Insert(BTree_Empty() as BSTree, 10),
8),
11),
7),
8)
Spec: BSTree-hide.nereus. Convención: · = BTree_Empty() as BSTree.
BSTree_Insert (i = 10)BTree_Empty() as BSTree → singleton 10.BSTree_Delete(
BSTree_Insert(
BSTree_Insert(
BSTree_Insert(
BTree_Create(BTree_Empty() as BSTree, BTree_Empty() as BSTree, 10) as BSTree,
8),
11),
7),
8)
i < j (8 < 10)(i < j) implies BSTree_Insert(BTree_Create(b1, b2, j) as BSTree, i) = BTree_Create(BSTree_Insert(b1 as BSTree, i), b2, j) as BSTree;Bindings:
b1 = b2 = ·, j = 10, i = 8.
BSTree_Delete(
BSTree_Insert(
BSTree_Insert(
BTree_Create(
BSTree_Insert(BTree_Empty() as BSTree, 8),
BTree_Empty() as BSTree,
10) as BSTree,
11),
7),
8)
BSTree_Delete(
BSTree_Insert(
BSTree_Insert(
BTree_Create(
BTree_Create(·, ·, 8) as BSTree,
BTree_Empty() as BSTree,
10) as BSTree,
11),
7),
8)
i > j (11 > 10)(i > j) implies BSTree_Insert(BTree_Create(b1, b2, j) as BSTree, i) = BTree_Create(b1, BSTree_Insert(b2 as BSTree, i), j) as BSTree;Bindings:
b1 = BTree_Create(·, ·, 8) as BSTree, b2 = ·, j = 10, i = 11.
BSTree_Delete(
BSTree_Insert(
BTree_Create(
BTree_Create(·, ·, 8) as BSTree,
BSTree_Insert(BTree_Empty() as BSTree, 11),
10) as BSTree,
7),
8)
BSTree_Delete(
BSTree_Insert(
BTree_Create(
BTree_Create(·, ·, 8) as BSTree,
BTree_Create(·, ·, 11) as BSTree,
10) as BSTree,
7),
8)
i < j (7 < 10), nivel raízb1 = BTree_Create(·, ·, 8) as BSTree, b2 = BTree_Create(·, ·, 11) as BSTree, j = 10, i = 7.
BSTree_Delete(
BTree_Create(
BSTree_Insert(BTree_Create(·, ·, 8) as BSTree, 7),
BTree_Create(·, ·, 11) as BSTree,
10) as BSTree,
8)
i < j (7 < 8), recursión en el subárbol izquierdoBSTree_Insert(BTree_Create(·, ·, 8) as BSTree, 7):b1' = b2' = ·, j' = 8, i = 7. Condición 7 < 8 ✓
BSTree_Delete(
BTree_Create(
BTree_Create(
BSTree_Insert(BTree_Empty() as BSTree, 7),
BTree_Empty() as BSTree,
8) as BSTree,
BTree_Create(·, ·, 11) as BSTree,
10) as BSTree,
8)
BSTree_Delete(
BTree_Create(
BTree_Create(
BTree_Create(·, ·, 7) as BSTree,
BTree_Empty() as BSTree,
8) as BSTree,
BTree_Create(·, ·, 11) as BSTree,
10) as BSTree,
8)
Hasta acá terminamos la fase de construcción. Llamemos T a este BST. Ahora arranca el BSTree_Delete(T, 8).
BSTree_Delete Caso A (j < i: 8 < 10), recurrir en el subárbol izquierdo(j < i) implies BSTree_Delete(BTree_Create(b1, b2, i) as BSTree, j) = BTree_Create(BSTree_Delete(b1 as BSTree, j), b2, i) as BSTree;Bindings:
b1 = BTree_Create(BTree_Create(·,·,7) as BSTree, ·, 8) as BSTreeb2 = BTree_Create(·, ·, 11) as BSTreei = 10, j = 8 → j < i ✓
BTree_Create(
BSTree_Delete(BTree_Create(BTree_Create(·,·,7) as BSTree, ·, 8) as BSTree, 8),
BTree_Create(·, ·, 11) as BSTree,
10) as BSTree
BSTree_Delete Caso E (j = i, izq. no vacío, der. vacío) ← punto interesanteBSTree_Delete(BTree_Create(BTree_Create(·,·,7) as BSTree, ·, 8) as BSTree, 8):b1' = BTree_Create(·, ·, 7) as BSTree → not BTree_IsEmpty(b1') ✓b2' = BTree_Empty() as BSTree → BTree_IsEmpty(b2') ✓i' = 8, j = 8 → j = i' ✓j = i:
| Caso | Condición de hijos | Aplica |
|---|---|---|
| C | IsEmpty(b1') ∧ IsEmpty(b2') = F ∧ T = F | No |
| D | IsEmpty(b1') ∧ ¬IsEmpty(b2') = F ∧ F = F | No |
| E | ¬IsEmpty(b1') ∧ IsEmpty(b2') = T ∧ T = T | Sí ← |
| F | ¬IsEmpty(b1') ∧ ¬IsEmpty(b2') = T ∧ F = F | No |
(j = i and not BTree_IsEmpty(b1) and BTree_IsEmpty(b2)) implies BSTree_Delete(BTree_Create(b1, b2, i) as BSTree, j) = b1 as BSTree;Resultado:
b1' = BTree_Create(·, ·, 7) as BSTree. El subárbol izquierdo simplemente sube a ocupar el lugar del nodo borrado.
BTree_Create(
BTree_Create(·, ·, 7) as BSTree,
BTree_Create(·, ·, 11) as BSTree,
10) as BSTree
Vista de árbol:
| Aspecto | Antes del Delete | Después del Delete |
|---|---|---|
| Elementos | {7, 8, 10, 11} | {7, 10, 11} |
| Estructura | raíz 10 con izq=BTree_Create(BTree_Create(·,·,7), ·, 8), der=BTree_Create(·,·,11) | raíz 10 con izq=BTree_Create(·,·,7), der=BTree_Create(·,·,11) |
| Altura | 3 | 2 |
| Invariante BST | 7 < 8 < 10 < 11 ✓ | 7 < 10 < 11 ✓ |
BSTree_Min + sub-Delete).Delete 12 sobre Insert(Insert(Insert(empty, 10), 12), 15).