// #include "..." namespace lasd { /* ************************************************************************** */ // checks if two trees which have the same root node are identical template bool BinaryTree::Node::operator==(const Node& toEvaluate){ return EqualNodes(this, &toEvaluate); } bool BinaryTree::Node::EqualNodes(Node* n1, Node* n2){ if(n1->IsLeaf() && n2->IsLeaf() && n1->data == n2->data) return true; if( (n1->HasLeftChild() && !n2->HasLeftChild()) || (n1->HasRightChild() && !n2->HasRightChild()) ) return false; return( n1->data == n2->data && EqualNodes(n1->LeftChild(),n2->LeftChild()) && EqualNodes(n1->RightChild(),n2->RightChild()) ) } template bool BinaryTree::Node::operator!=(const Node& toEvaluate){ return !(*this == toEvaluate) } template Data& BinaryTree::Node::Element(){ return this->data; } template const Data& BinaryTree::Node::Element(){ return this->data; } template bool BinaryTree::operator==(const BinaryTree& toCompare) const noexcept{ return(Root() == toCompare.Root()); } template bool BinaryTree::operator!=(const BinaryTree& toCompare) const noexcept{ return(Root() != toCompare.Root()); } template void BinaryTree::MapPreOrder(const MapFunctor function, void* par){ MapPreOrder(function, par, &Root()); } template void BinaryTree::MapPostOrder(const MapFunctor function, void* par){ MapPostOrder(function, par, &Root()); } template void BinaryTree::FoldPreOrder(const FoldFunctor function, const void* par, void* acc){ FoldPreOrder(function, par, acc, &Root()); } template void BinaryTree::FoldPostOrder(const FoldFunctor function, const void* par, void* acc) const{ FoldPostOrder(function, par, acc, &Root()); } template void BinaryTree::MapInOrder(const MapFunctor function, void* par){ MapInOrder(function, par, &Root()); } template void BinaryTree::FoldInOrder(const MapFunctor function, const void* par, void* acc) const{ FoldInOrder(function, par, acc, &Root()); } template void BinaryTree::MapBreadth(const MapFunctor function, void* par){ MapBreadth(function, par, &Root()); } template void BinaryTree::FoldBreadth(const FoldFunctor function, const void* par, void* acc) const{ FoldBreadth(function, par, acc, &Root()); } /* ----- AUX ----- */ template void BinaryTree::MapPreOrder(const MapFunctor function, void* par, Node* node){ if(node != nullptr){ function(node->Element(), par); if(node->HasLeftChild()){ MapPreOrder(function, par, node->LeftChild()); } if(node->HasRightChild()){ MapPreOrder(function, par, node->RightChild()); } } } template void BinaryTree::MapPostOrder(const MapFunctor function, void* par, Node* node){ if(node != nullptr){ if(node->HasLeftChild()){ MapPreOrder(function, par, node->LeftChild()); } if(node->HasRightChild()){ MapPreOrder(function, par, node->RightChild()); } function(node->Element(), par); } } template void BinaryTree::FoldPreOrder(const FoldFunctor function, const void* par, void* acc, const Node* node){ if(node != nullptr){ function(node->Element(), par, acc); if(node->HasLeftChild()){ FoldPreOrder(function, par, acc, node->LeftChild()); } if(node->HasRightChild()){ FoldPreOrder(function, par, acc, node->RightChild()); } } } template void BinaryTree::FoldPostOrder(const FoldFunctor function, const void* par, void* acc, const Node* node){ if(node != nullptr){ if(node->HasLeftChild()){ FoldPreOrder(function, par, acc, node->LeftChild()); } if(node->HasRightChild()){ MapPreOrder(function, par, acc, node->RightChild()); } function(node->Element(), par, acc); } } template void BinaryTree::MapInOrder(const MapFunctor function, void* par, Node* node){ if(node != nullptr){ if(node->HasLeftChild()){ MapInOrder(function, par, node->LeftChild()); } function(node->Element(), par); if(node->HasRightChild()){ MapInOrder(function, par, node->RightChild()); } } } template void FoldInOrder(const FoldFunctor function, const void* par, void* acc, const Node* node) const{ if(node != nullptr){ if(node->HasLeftChild()){ FoldInOrder(function, par, acc, node->LeftChild()); } function(node->Element(), par, acc); if(node->HasRightChild()){ FoldPreOrder(function, par, acc, node->RightChild()); } } } template void MapBreadth(const MapFunctor function, void* par, Node* node){ QueueLst toVisit; if(node != nullptr){ toVisit.Enqueue(node); while(!toVisit.Empty()){ func(toVisit.Head()->Element(), par); if(toVisit.Head()->HasLeftChild()){ toVisit.Enqueue(&(toVisit.Head()->LeftChild())); } if(toVisit.Head()->HasRightChild()){ toVisit.Enqueue(&(toVisit.Head()->RightChild())); } ql.Dequeue(); } } } /* ************************************************************************** */ }