mirror of https://github.com/xfarrow/lasd.git
parent
90f20eb405
commit
147730b10b
|
@ -78,21 +78,18 @@ void BST<Data>::Remove(const Data& data) noexcept{
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
const Data& BST<Data>::Min() const{
|
const Data& BST<Data>::Min() const{
|
||||||
if(root == nullptr) throw std::length_error("Empty tree!");
|
if(root == nullptr) throw std::length_error("Empty tree!");
|
||||||
|
|
||||||
return FindPointerToMin(root)->Element();
|
return FindPointerToMin(root)->Element();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
Data BST<Data>::MinNRemove(){
|
Data BST<Data>::MinNRemove(){
|
||||||
if(root == nullptr) throw std::length_error("Empty tree!");
|
if(root == nullptr) throw std::length_error("Empty tree!");
|
||||||
|
|
||||||
return DataNDelete(DetachMin(root));
|
return DataNDelete(DetachMin(root));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
void BST<Data>::RemoveMin(){
|
void BST<Data>::RemoveMin(){
|
||||||
if(root == nullptr) throw std::length_error("Empty tree!");
|
if(root == nullptr) throw std::length_error("Empty tree!");
|
||||||
|
|
||||||
delete DetachMin(root);
|
delete DetachMin(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,21 +97,18 @@ void BST<Data>::RemoveMin(){
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
const Data& BST<Data>::Max() const{
|
const Data& BST<Data>::Max() const{
|
||||||
if(root == nullptr) throw std::length_error("Empty tree!");
|
if(root == nullptr) throw std::length_error("Empty tree!");
|
||||||
|
|
||||||
return FindPointerToMax(root)->Element();
|
return FindPointerToMax(root)->Element();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
Data BST<Data>::MaxNRemove(){
|
Data BST<Data>::MaxNRemove(){
|
||||||
if(root == nullptr) throw std::length_error("Empty tree!");
|
if(root == nullptr) throw std::length_error("Empty tree!");
|
||||||
|
|
||||||
return DataNDelete(DetachMax(root));
|
return DataNDelete(DetachMax(root));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
void BST<Data>::RemoveMax(){
|
void BST<Data>::RemoveMax(){
|
||||||
if(root == nullptr) throw std::length_error("Empty tree!");
|
if(root == nullptr) throw std::length_error("Empty tree!");
|
||||||
|
|
||||||
delete DetachMax(root);
|
delete DetachMax(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,6 +235,14 @@ typename BST<Data>::NodeLnk* BST<Data>::SkipOnRight(struct BST<Data>::NodeLnk*&
|
||||||
|
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
typename BST<Data>::NodeLnk* const& BST<Data>::FindPointerToMin(struct BST<Data>::NodeLnk* const& node) const noexcept{
|
typename BST<Data>::NodeLnk* const& BST<Data>::FindPointerToMin(struct BST<Data>::NodeLnk* const& node) const noexcept{
|
||||||
|
/*
|
||||||
|
In order to return a [reference to a] const pointer, we need to
|
||||||
|
declare a variable (ptr) which points to a const pointer which points to
|
||||||
|
a NodeLnk.
|
||||||
|
This const pointer that points to a NodeLnk is the parameter of the function.
|
||||||
|
|
||||||
|
Hence, *ptr will be a const pointer.
|
||||||
|
*/
|
||||||
NodeLnk* const* ptr = &node;
|
NodeLnk* const* ptr = &node;
|
||||||
NodeLnk* curr = node;
|
NodeLnk* curr = node;
|
||||||
if(curr!=nullptr){
|
if(curr!=nullptr){
|
||||||
|
@ -279,23 +281,27 @@ typename BST<Data>::NodeLnk*& BST<Data>::FindPointerToMax(struct BST<Data>::Node
|
||||||
|
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
typename BST<Data>::NodeLnk* const& BST<Data>::FindPointerTo(struct BST<Data>::NodeLnk* const& ref, Data data) const noexcept{
|
typename BST<Data>::NodeLnk* const& BST<Data>::FindPointerTo(struct BST<Data>::NodeLnk* const& ref, Data data) const noexcept{
|
||||||
NodeLnk* const* pointer = &ref;
|
/*
|
||||||
|
In order to return a [reference to a] const pointer, we need to
|
||||||
|
declare a variable (pointer) which points to a const pointer which points to
|
||||||
|
a NodeLnk.
|
||||||
|
This const pointer that points to a NodeLnk is the parameter of the function.
|
||||||
|
|
||||||
|
Hence, *pointer will be a const pointer.
|
||||||
|
*/
|
||||||
|
NodeLnk* const* pointer = &ref; //a pointer to a const pointer to a NodeLnk
|
||||||
NodeLnk* current = ref;
|
NodeLnk* current = ref;
|
||||||
if(current != nullptr){
|
|
||||||
while(current != nullptr && current->Element() != data){
|
while(current != nullptr && current->Element() != data){
|
||||||
if(current->Element() < data){
|
if(current->Element() < data){
|
||||||
pointer = ¤t->right;
|
pointer = &(current->right);
|
||||||
current = current->right;
|
current = current->right;
|
||||||
}else if(current->Element() > data){
|
}else if(current->Element() > data){
|
||||||
pointer = ¤t->left;
|
pointer = &(current->left);
|
||||||
current = current->left;
|
current = current->left;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return *pointer;
|
return *pointer;
|
||||||
|
|
||||||
}else{
|
|
||||||
return *pointer;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -304,21 +310,19 @@ typename BST<Data>::NodeLnk*& BST<Data>::FindPointerTo(struct BST<Data>::NodeLnk
|
||||||
return const_cast<NodeLnk*&>(static_cast<const BST<Data> *>(this)->FindPointerTo(node, data));
|
return const_cast<NodeLnk*&>(static_cast<const BST<Data> *>(this)->FindPointerTo(node, data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
typename BST<Data>::NodeLnk* const* BST<Data>::FindPointerToPredecessor(struct BST<Data>::NodeLnk* const& ref, Data data) const noexcept{
|
typename BST<Data>::NodeLnk* const* BST<Data>::FindPointerToPredecessor(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* lastRight = pointer;
|
NodeLnk* const* lastRight = pointer;
|
||||||
|
|
||||||
|
if(ref != nullptr){
|
||||||
if(ref != nullptr){
|
|
||||||
while( current != nullptr){
|
while( current != nullptr){
|
||||||
if(data == current->Element()){
|
if(data == current->Element()){
|
||||||
if(current->HasLeftChild()){
|
if(current->HasLeftChild()){
|
||||||
return pointer = &(FindPointerToMax(current->left));
|
return pointer = &(FindPointerToMax(current->left));
|
||||||
}
|
}
|
||||||
return lastRight;
|
return lastRight;
|
||||||
}else if(data < current->Element()){
|
}else if(data < current->Element()){
|
||||||
pointer = ¤t->left;
|
pointer = ¤t->left;
|
||||||
current = current->left;
|
current = current->left;
|
||||||
|
@ -329,9 +333,9 @@ if(ref != nullptr){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return lastRight;
|
return lastRight;
|
||||||
}else{
|
}else{
|
||||||
return lastRight;
|
return lastRight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
|
@ -346,24 +350,23 @@ typename BST<Data>::NodeLnk* const* BST<Data>::FindPointerToSuccessor(struct BST
|
||||||
NodeLnk* current = ref;
|
NodeLnk* current = ref;
|
||||||
NodeLnk* const* lastLeft = nullptr;
|
NodeLnk* const* lastLeft = nullptr;
|
||||||
|
|
||||||
|
|
||||||
if(ref != nullptr){
|
if(ref != 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 pointer = &(FindPointerToMin(current->right));
|
||||||
}
|
|
||||||
return lastLeft;
|
|
||||||
}else if(data < current->Element()){
|
|
||||||
lastLeft = pointer;
|
|
||||||
pointer = ¤t->left;
|
|
||||||
current = current->left;
|
|
||||||
}else{
|
|
||||||
pointer = ¤t->right;
|
|
||||||
current = current->right;
|
|
||||||
}
|
}
|
||||||
|
return lastLeft;
|
||||||
|
}else if(data < current->Element()){
|
||||||
|
lastLeft = pointer;
|
||||||
|
pointer = ¤t->left;
|
||||||
|
current = current->left;
|
||||||
|
}else{
|
||||||
|
pointer = ¤t->right;
|
||||||
|
current = current->right;
|
||||||
}
|
}
|
||||||
return lastLeft;
|
}
|
||||||
|
return lastLeft;
|
||||||
}else{
|
}else{
|
||||||
return lastLeft;
|
return lastLeft;
|
||||||
}
|
}
|
||||||
|
@ -374,8 +377,4 @@ typename BST<Data>::NodeLnk** BST<Data>::FindPointerToSuccessor(struct BST<Data>
|
||||||
return const_cast<NodeLnk**>(static_cast<const BST<Data> *>(this)->FindPointerToSuccessor(node, data));
|
return const_cast<NodeLnk**>(static_cast<const BST<Data> *>(this)->FindPointerToSuccessor(node, data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ************************************************************************** */
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,16 +2,10 @@
|
||||||
#ifndef BST_HPP
|
#ifndef BST_HPP
|
||||||
#define BST_HPP
|
#define BST_HPP
|
||||||
|
|
||||||
/* ************************************************************************** */
|
|
||||||
|
|
||||||
#include "../binarytree/lnk/binarytreelnk.hpp"
|
#include "../binarytree/lnk/binarytreelnk.hpp"
|
||||||
|
|
||||||
/* ************************************************************************** */
|
|
||||||
|
|
||||||
namespace lasd {
|
namespace lasd {
|
||||||
|
|
||||||
/* ************************************************************************** */
|
|
||||||
|
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
class BST : virtual public BinaryTreeLnk<Data> { // Must extend BinaryTreeLnk<Data>
|
class BST : virtual public BinaryTreeLnk<Data> { // Must extend BinaryTreeLnk<Data>
|
||||||
|
|
||||||
|
@ -25,43 +19,18 @@ protected:
|
||||||
public:
|
public:
|
||||||
|
|
||||||
BST() = default;
|
BST() = default;
|
||||||
|
BST(const LinearContainer<Data>&);
|
||||||
/* ************************************************************************ */
|
|
||||||
|
|
||||||
// Specific constructors
|
|
||||||
BST(const LinearContainer<Data>&); // A bst obtained from a LinearContainer
|
|
||||||
|
|
||||||
/* ************************************************************************ */
|
|
||||||
|
|
||||||
// Copy constructor
|
|
||||||
BST(const BST<Data>&);
|
BST(const BST<Data>&);
|
||||||
|
|
||||||
// Move constructor
|
|
||||||
BST(BST<Data>&&) noexcept;
|
BST(BST<Data>&&) noexcept;
|
||||||
|
|
||||||
/* ************************************************************************ */
|
|
||||||
|
|
||||||
// Destructor
|
|
||||||
virtual ~BST();
|
virtual ~BST();
|
||||||
|
|
||||||
/* ************************************************************************ */
|
|
||||||
|
|
||||||
// Copy assignment
|
|
||||||
BST<Data>& operator=(const BST<Data>&);
|
BST<Data>& operator=(const BST<Data>&);
|
||||||
|
|
||||||
// Move assignment
|
|
||||||
BST<Data>& operator=(BST<Data>&&) noexcept;
|
BST<Data>& operator=(BST<Data>&&) noexcept;
|
||||||
|
|
||||||
/* ************************************************************************ */
|
|
||||||
|
|
||||||
// Comparison operators
|
|
||||||
bool operator==(const BST<Data>&) const noexcept;
|
bool operator==(const BST<Data>&) const noexcept;
|
||||||
bool operator!=(const BST<Data>&) const noexcept;
|
bool operator!=(const BST<Data>&) const noexcept;
|
||||||
|
|
||||||
/* ************************************************************************ */
|
|
||||||
|
|
||||||
// Specific member functions
|
|
||||||
|
|
||||||
void Insert(const Data&) noexcept; // Copy of the value
|
void Insert(const Data&) noexcept; // Copy of the value
|
||||||
void Insert(Data&&) noexcept; // Move of the value
|
void Insert(Data&&) noexcept; // Move of the value
|
||||||
void Remove(const Data&) noexcept;
|
void Remove(const Data&) noexcept;
|
||||||
|
@ -82,13 +51,9 @@ public:
|
||||||
Data SuccessorNRemove(const Data&); // (concrete function must throw std::length_error when empty)
|
Data SuccessorNRemove(const Data&); // (concrete function must throw std::length_error when empty)
|
||||||
void RemoveSuccessor(const Data&); // (concrete function must throw std::length_error when empty)
|
void RemoveSuccessor(const Data&); // (concrete function must throw std::length_error when empty)
|
||||||
|
|
||||||
/* ************************************************************************ */
|
|
||||||
|
|
||||||
// Specific member functions (inherited from TestableContainer)
|
|
||||||
|
|
||||||
bool Exists(const Data&) const noexcept override; // Override TestableContainer member
|
bool Exists(const Data&) const noexcept override; // Override TestableContainer member
|
||||||
|
|
||||||
protected:
|
public:
|
||||||
|
|
||||||
// Auxiliary member functions
|
// Auxiliary member functions
|
||||||
|
|
||||||
|
@ -114,14 +79,8 @@ protected:
|
||||||
NodeLnk** FindPointerToPredecessor(NodeLnk*&, Data) noexcept;
|
NodeLnk** FindPointerToPredecessor(NodeLnk*&, Data) noexcept;
|
||||||
NodeLnk* const* FindPointerToSuccessor(NodeLnk* const&, Data) const noexcept;
|
NodeLnk* const* FindPointerToSuccessor(NodeLnk* const&, Data) const noexcept;
|
||||||
NodeLnk** FindPointerToSuccessor(NodeLnk*&, Data) noexcept;
|
NodeLnk** FindPointerToSuccessor(NodeLnk*&, Data) noexcept;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ************************************************************************** */
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "bst.cpp"
|
#include "bst.cpp"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,11 +2,11 @@
|
||||||
#include "zlasdtest/test.hpp"
|
#include "zlasdtest/test.hpp"
|
||||||
|
|
||||||
#include "zmytest/test.hpp"
|
#include "zmytest/test.hpp"
|
||||||
|
#include "bst/bst.hpp"
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
using namespace lasd;
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
Loading…
Reference in New Issue