Binary search tree: remove: Difference between revisions
Line 20: | Line 20: | ||
== Abstract view == | == Abstract view == | ||
'''Invariant''' After <math>i \geq 0</math> interations: | '''Invariant''' After <math>i \geq 0</math> interations: | ||
# The pointer | # The pointer <math>p</math> points to a tree node <math>v</math> on height level <math>i</math>. | ||
# The key | # The key <math>K</math> is in [[Directed Tree#Ranges of Search Tree Nodes|range]] of <math>p</math>, but <math>p.key \neq K</math>. | ||
'''Variant:''' | '''Variant:''' <math>i</math> increased by <math>1</math>. | ||
'''Break Condition:''' One of the following two conditions is fulfilled: | '''Break Condition:''' One of the following two conditions is fulfilled: |
Revision as of 07:54, 18 May 2015
General Information
Algorithmic Problem: Sorted sequence:remove
Type of algorithm: loop
Auxiliary data: A pointer [math]\displaystyle{ p }[/math] of type "pointer to binary search tree node of type [math]\displaystyle{ \mathcal{K} }[/math]."
Abstract view
Invariant After [math]\displaystyle{ i \geq 0 }[/math] interations:
- The pointer [math]\displaystyle{ p }[/math] points to a tree node [math]\displaystyle{ v }[/math] on height level [math]\displaystyle{ i }[/math].
- The key [math]\displaystyle{ K }[/math] is in range of [math]\displaystyle{ p }[/math], but [math]\displaystyle{ p.key \neq K }[/math].
Variant: [math]\displaystyle{ i }[/math] increased by [math]\displaystyle{ 1 }[/math].
Break Condition: One of the following two conditions is fulfilled:
- It is [math]\displaystyle{ K \lt p.key }[/math] and either [math]\displaystyle{ p.left = void }[/math] or [math]\displaystyle{ p.left.key = K }[/math].
- It is [math]\displaystyle{ K \gt p.key }[/math] and either [math]\displaystyle{ p.right = void }[/math] or [math]\displaystyle{ p.right.key = K }[/math].
Induction basis
Abstract view:
- If the root contains K, remove this occurrence of K.
- Otherwise, initialize p so as to point to the root.
Implementation:
- If [math]\displaystyle{ root.key = K }[/math]:
- If [math]\displaystyle{ root.left = void }[/math], set [math]\displaystyle{ root := root.right }[/math]
- Otherwise, if [math]\displaystyle{ root.right = void }[/math], set [math]\displaystyle{ root := root.left }[/math].
- Otherwise, call method remove node with pointer root.
- Terminate the algorithm and return true.
- Otherwise set [math]\displaystyle{ p := root }[/math]
Proof: Nothing to show.
Induction step
Abstract View:
- If the next node where to go does not exist or contains K, terminate the algorithm (and in the latter case, remove that node appropriately).
- Otherwise, descend to that node.
Implementation:
- I [math]\displaystyle{ K \lt p.key }[/math]:
- If [math]\displaystyle{ p.left = void }[/math], terminate the algorithm and return false.
- Otherwise if [math]\displaystyle{ p.left.key = K }[/math]:
- If [math]\displaystyle{ p.left.left = void }[/math], set [math]\displaystyle{ p.left := p.left.right }[/math].
- Otherwise, if [math]\displaystyle{ p.left.right = void }[/math], set [math]\displaystyle{ p.left := p.left.left }[/math].
- Otherwise, call method remove node with pointer p.left.
- Terminate the algorithm and return true.
- Otherwise (that is, [math]\displaystyle{ p.left \neq void }[/math] and [math]\displaystyle{ p.left.key \neq K }[/math]), set [math]\displaystyle{ p := p.left }[/math].
- Otherwise (that is, [math]\displaystyle{ K \gt p.key }[/math]):
- If [math]\displaystyle{ p.right = void }[/math], terminate the algorithm and return false.
- Otherwise, if [math]\displaystyle{ p.right.key = K }[/math]:
- If [math]\displaystyle{ p.right.left = void }[/math], set [math]\displaystyle{ p.right = p.right.right }[/math].
- Otherwise, if [math]\displaystyle{ p.right.right = void }[/math], set [math]\displaystyle{ p.right = p.right.left }[/math].
- Otherwise, call method remove node with pointer p.right.
- Terminate the algorithm and return true.
- Otherwise (that is, [math]\displaystyle{ p.right \neq void }[/math] and [math]\displaystyle{ p.right.key \neq K }[/math]), set [math]\displaystyle{ p:= p.right }[/math].
Correctness: Nothing to show.
Pseudocode
TREE-DELETE(T,z)
- if left[z] = NULL or right[z] = NULL
- then y = z
- else y = TREE-SUCCESSOR(z)
- if left[y] ≠ NULL
- then x = left[y]
- else x = right[y]
- if x ≠ NULL
- then p[x] = p [y]
- if p[y] = NULL
- then root[T] = x
- else if y = left[p[y]]
- then left[p[y]] = x
- else right[p[y]] = x
- if y ≠ z
- then key[z] = key[y]
- copy y's satellite data into z
- then key[z] = key[y]
- return y
Complexity
Statement: The complexity is in [math]\displaystyle{ \mathcal{O}(T\cdot h)\subseteq\mathcal{O}(T\cdot n) }[/math] in the worst case, where [math]\displaystyle{ n }[/math] is the length of the sequence, [math]\displaystyle{ h }[/math] the height of the tree, and [math]\displaystyle{ T }[/math] the complexity of the comparison.
Proof: Obvious.