mirror of https://github.com/xfarrow/lasd.git
parent
ae5b251099
commit
cafa032363
|
@ -307,28 +307,33 @@ typename BST<Data>::NodeLnk* const* BST<Data>::FindPointerToPredecessor(struct B
|
||||||
/*
|
/*
|
||||||
If the element we are looking the predecessor for is the current element,
|
If the element we are looking the predecessor for is the current element,
|
||||||
then its predecessor resides in the max node of its left subtree (if it has
|
then its predecessor resides in the max node of its left subtree (if it has
|
||||||
a left subtree, return the lastRight otherwise).
|
a left subtree. Return the lastRight otherwise).
|
||||||
|
|
||||||
If the element we are looking the predecessor for is greater than the current element,
|
If the element we are looking the predecessor for is greater than the current element,
|
||||||
then we have to go down right the tree, saving the current "lastRight".
|
then we have to go down right the tree, saving the current "lastRight".
|
||||||
|
|
||||||
If the element we are looking the predecessor for is less than the current element,
|
If the element we are looking the predecessor for is less than the current element,
|
||||||
then we have to go down left the tree,
|
then we have to go down left the tree.
|
||||||
|
|
||||||
|
|
||||||
|
Note: I return a ** instead of *& because we deferenciate a variable that might
|
||||||
|
contain nullptr (lastRight) that, without proper handling, would result to
|
||||||
|
an invalid read. I decided to keep it simpler to understand.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
NodeLnk* const* pointer = &ref;
|
NodeLnk* const* pointer = &ref;
|
||||||
NodeLnk* current = ref;
|
NodeLnk* current = ref;
|
||||||
NodeLnk* const* lastRight = nullptr;
|
NodeLnk* const* candidate = nullptr;
|
||||||
|
|
||||||
while(current != nullptr){
|
while(current != nullptr){
|
||||||
if(data == current->Element()){
|
if(data == current->Element()){
|
||||||
if(current->HasLeftChild()){
|
if(current->HasLeftChild()){
|
||||||
return &(FindPointerToMax(current->left));
|
return &(FindPointerToMax(current->left));
|
||||||
}else{
|
}else{
|
||||||
return lastRight;
|
return candidate;
|
||||||
}
|
}
|
||||||
}else if(current->Element() < data){
|
}else if(current->Element() < data){
|
||||||
lastRight = pointer;
|
candidate = pointer;
|
||||||
pointer = &(current->right);
|
pointer = &(current->right);
|
||||||
current = current->right;
|
current = current->right;
|
||||||
}else if(current->Element() > data){
|
}else if(current->Element() > data){
|
||||||
|
@ -336,25 +341,25 @@ typename BST<Data>::NodeLnk* const* BST<Data>::FindPointerToPredecessor(struct B
|
||||||
current = current->left;
|
current = current->left;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return lastRight;
|
return candidate;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
typename BST<Data>::NodeLnk* const* BST<Data>::FindPointerToSuccessor(struct BST<Data>::NodeLnk* const& ref, Data data) const noexcept{
|
typename BST<Data>::NodeLnk* const* BST<Data>::FindPointerToSuccessor(struct BST<Data>::NodeLnk* const& ref, Data data) const noexcept{
|
||||||
NodeLnk* const* pointer = &ref;
|
NodeLnk* const* pointer = &ref;
|
||||||
NodeLnk* current = ref;
|
NodeLnk* current = ref;
|
||||||
NodeLnk* const* lastLeft = nullptr;
|
NodeLnk* const* candidate = nullptr;
|
||||||
|
|
||||||
while( current != nullptr){
|
while( current != nullptr){
|
||||||
if(data == current->Element()){
|
if(data == current->Element()){
|
||||||
if(current->HasRightChild()){
|
if(current->HasRightChild()){
|
||||||
return pointer = &(FindPointerToMin(current->right));
|
return &(FindPointerToMin(current->right));
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
return lastLeft;
|
return candidate;
|
||||||
}
|
}
|
||||||
}else if(current->Element() > data){
|
}else if(current->Element() > data){
|
||||||
lastLeft = pointer;
|
candidate = pointer;
|
||||||
pointer = ¤t->left;
|
pointer = ¤t->left;
|
||||||
current = current->left;
|
current = current->left;
|
||||||
}else if(current->Element() < data){
|
}else if(current->Element() < data){
|
||||||
|
@ -362,7 +367,7 @@ typename BST<Data>::NodeLnk* const* BST<Data>::FindPointerToSuccessor(struct BST
|
||||||
current = current->right;
|
current = current->right;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return lastLeft;
|
return candidate;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
|
|
Loading…
Reference in New Issue