Module 5
Binary Trees
Remove Element
CC315 Fall 2020
Motivation
When we need to remove a node, we will replace it with its smallest right descendant
Types of Removal
- Leaf
- No Right Child
- Right Child
Removing a Leaf
Removing a Node with No Right Child
Removing a Node with
Right Child
Needed Functions
- Remove
- Remove Smallest
- Prune (Left and Right)
Pruning
function PRUNERIGHT()
if RIGHTCHILD has no value
REMOVECHILD(RIGHTCHILD)
set this nodes RIGHTCHILD former RIGHTCHILDs RIGHTCHILD
if RIGHTCHLID is not none
ADDCHILD(RIGHTCHILD)
function PRUNELEFT()
if LEFTCHILD has no value
REMOVECHILD(LEFTCHILD)
set this nodes LEFTCHILD former LEFTCHILDs RIGHTCHILD
if LEFTCHILD is not none
ADDCHILD(LEFTCHILD)
Remove Smallest
function REMOVESMALLEST()
if node has left child
REPLACEMENT = LEFTCHILD.REMOVESMALLEST
prune left-side
return REPLACEMENT
else
REPLACEMENT = node.ITEM
if node has right child
node.ITEM = RIGHTCHILD.REMOVESMALLEST()
prune right-side
else
node.ITEM = NONE
return REPLACEMENT
end function
Remove Smallest
function REMOVESMALLEST()
if node has left child
REPLACEMENT = LEFTCHILD.REMOVESMALLEST
prune left-side
return REPLACEMENT
else
REPLACEMENT = node.ITEM
if node has right child
node.ITEM = RIGHTCHILD.REMOVESMALLEST()
prune right-side
else
node.ITEM = NONE
return REPLACEMENT
end function
Remove Smallest
function REMOVESMALLEST()
if node has left child
REPLACEMENT = LEFTCHILD.REMOVESMALLEST()
prune left-side
return REPLACEMENT
else
REPLACEMENT = node.ITEM
if node has right child
node.ITEM = RIGHTCHILD.REMOVESMALLEST()
prune right-side
else
node.ITEM = NONE
return REPLACEMENT
end function
Remove
function REMOVE(VALUE)
if node.ITEM is VALUE
if node is a leaf
set node.ITEM to none
return TRUE
else if node has no right child
node.ITEM = LEFTCHILD.REMOVESMALLEST()
prune left-side
switch left child to right child
return TRUE
else
node.ITEM = LEFTCHILD.REMOVESMALLEST()
prune right-side
return TRUE
else
if node.ITEM > VALUE
if node has LEFTCHILD
SUCCESS = LEFTCHILD.REMOVE(VALUE)
prune left-side
return SUCCESS
else
return FALSE
else
if node has RIGHTCHILD
SUCCESS = RIGHTCHILD.REMOVE(VALUE)
prune right-side
return SUCCESS
else
return FALSE
end function
Remove
function REMOVE(VALUE)
if node.ITEM is VALUE
if node is a leaf
set node.ITEM to none
return TRUE
else if node has no right child
node.ITEM = LEFTCHILD.REMOVESMALLEST()
prune left-side
switch left child to right child
return TRUE
else
node.ITEM = LEFTCHILD.REMOVESMALLEST()
prune right-side
return TRUE
else
if node.ITEM > VALUE
if node has LEFTCHILD
SUCCESS = LEFTCHILD.REMOVE(VALUE)
prune left-side
return SUCCESS
else
return FALSE
else
if node has RIGHTCHILD
SUCCESS = RIGHTCHILD.REMOVE(VALUE)
prune right-side
return SUCCESS
else
return FALSE
end function
Remove
function REMOVE(VALUE)
if node.ITEM is VALUE
if node is a leaf
set node.ITEM to none
return TRUE
else if node has no right child
node.ITEM = LEFTCHILD.REMOVESMALLEST()
prune left-side
switch left child to right child
return TRUE
else
node.ITEM = LEFTCHILD.REMOVESMALLEST()
prune right-side
return TRUE
else
if node.ITEM > VALUE
if node has LEFTCHILD
SUCCESS = LEFTCHILD.REMOVE(VALUE)
prune left-side
return SUCCESS
else
return FALSE
else
if node has RIGHTCHILD
SUCCESS = RIGHTCHILD.REMOVE(VALUE)
prune right-side
return SUCCESS
else
return FALSE
end function
Remove
function REMOVE(VALUE)
if node.ITEM is VALUE
if node is a leaf
set node.ITEM to none
return TRUE
else if node has no right child
node.ITEM = LEFTCHILD.REMOVESMALLEST()
prune left-side
switch left child to right child
return TRUE
else
node.ITEM = LEFTCHILD.REMOVESMALLEST()
prune right-side
return TRUE
else
if node.ITEM > VALUE
if node has LEFTCHILD
SUCCESS = LEFTCHILD.REMOVE(VALUE)
prune left-side
return SUCCESS
else
return FALSE
else
if node has RIGHTCHILD
SUCCESS = RIGHTCHILD.REMOVE(VALUE)
prune right-side
return SUCCESS
else
return FALSE
end function
Remove
function REMOVE(VALUE)
if node.ITEM is VALUE
if node is a leaf
set node.ITEM to none
return TRUE
else if node has no right child
node.ITEM = LEFTCHILD.REMOVESMALLEST()
prune left-side
switch left child to right child
return TRUE
else
node.ITEM = LEFTCHILD.REMOVESMALLEST()
prune right-side
return TRUE
else
if node.ITEM > VALUE
if node has LEFTCHILD
SUCCESS = LEFTCHILD.REMOVE(VALUE)
prune left-side
return SUCCESS
else
return FALSE
else
if node has RIGHTCHILD
SUCCESS = RIGHTCHILD.REMOVE(VALUE)
prune right-side
return SUCCESS
else
return FALSE
end function