cis22c/05-trees/BinaryTree.h
Iurii Tatishchev 01d2d7f2cf
8.14 Lab*: BT <--- BST ADT (Park)
- Modify the Park class from previous assignments.
- Rewrite the private insert as a recursive function.
- Write the buildBST() function (similar to buildList() in the doubly-linked list lab).
- Display the number of nodes in the tree as shown below:

- Display the tree in inorder, preorder or postorder
- Display the tree as an indented list
- Display the inner nodes of the BST (including its root), in alphabetical order by code

- Write the searchManager() function (similar to searchManager() in the doubly-linked list lab). It calls search BST in a loop.
- Search the BST (implement the recursive private search function).
2024-05-03 17:08:04 -07:00

140 lines
4.2 KiB
C++

// Binary tree abstract base class
// Created by Iurii Tatishchev
// Modified by: Iurii Tatishchev
#ifndef _BINARY_TREE
#define _BINARY_TREE
#include "BinaryNode.h"
template<class ItemType>
class BinaryTree {
protected:
BinaryNode<ItemType> *rootPtr; // ptr to root node
int count; // number of nodes in tree
public:
// "admin" functions
BinaryTree() {
rootPtr = nullptr;
count = 0;
}
BinaryTree(const BinaryTree<ItemType> &tree) {}
virtual ~BinaryTree() { destroyTree(rootPtr); }
// common functions for all binary trees
bool isEmpty() const { return count == 0; }
int getCount() const { return count; }
void clear() {
destroyTree(rootPtr);
rootPtr = nullptr;
count = 0;
}
void preOrder(void visit(const ItemType &)) const { _preorder(visit, rootPtr); }
void inOrder(void visit(const ItemType &)) const { _inorder(visit, rootPtr); }
void postOrder(void visit(const ItemType &)) const { _postorder(visit, rootPtr); }
void printTree(void visit(const ItemType &, int)) const { _printTree(visit, rootPtr, 1); }
void printInnerNodes(void visit(const ItemType &)) const { _printInnerNodes(visit, rootPtr); }
// abstract functions to be implemented by derived class
virtual bool insert(const ItemType &newData) = 0;
//virtual bool remove(const ItemType &data) = 0;
virtual bool search(const ItemType &target, ItemType &returnedItem) const = 0;
private:
// delete all nodes from the tree
void destroyTree(BinaryNode<ItemType> *nodePtr);
// internal traverse
void _preorder(void visit(const ItemType &), BinaryNode<ItemType> *nodePtr) const;
void _inorder(void visit(const ItemType &), BinaryNode<ItemType> *nodePtr) const;
void _postorder(void visit(const ItemType &), BinaryNode<ItemType> *nodePtr) const;
void _printTree(void visit(const ItemType &, int), BinaryNode<ItemType> *nodePtr, int level) const;
void _printInnerNodes(void visit(const ItemType &), BinaryNode<ItemType> *nodePtr) const;
};
// Destroy the entire tree
template<class ItemType>
void BinaryTree<ItemType>::destroyTree(BinaryNode<ItemType> *nodePtr) {
if (nodePtr) // != NULL
{
destroyTree(nodePtr->getLeftPtr());
destroyTree(nodePtr->getRightPtr());
// cout << "DEBUG - Destructor: Now deleting " << nodePtr->getItem().getName() << endl;
delete nodePtr;
}
}
// Preorder Traversal
template<class ItemType>
void BinaryTree<ItemType>::_preorder(void visit(const ItemType &), BinaryNode<ItemType> *nodePtr) const {
if (nodePtr == nullptr) return;
ItemType item = nodePtr->getItem();
visit(item);
_preorder(visit, nodePtr->getLeftPtr());
_preorder(visit, nodePtr->getRightPtr());
}
// Inorder Traversal
template<class ItemType>
void BinaryTree<ItemType>::_inorder(void visit(const ItemType &), BinaryNode<ItemType> *nodePtr) const {
if (nodePtr) // != NULL
{
ItemType item = nodePtr->getItem();
_inorder(visit, nodePtr->getLeftPtr());
visit(item);
_inorder(visit, nodePtr->getRightPtr());
}
}
// Postorder Traversal
template<class ItemType>
void BinaryTree<ItemType>::_postorder(void visit(const ItemType &), BinaryNode<ItemType> *nodePtr) const {
if (nodePtr == nullptr) return;
_postorder(visit, nodePtr->getLeftPtr());
_postorder(visit, nodePtr->getRightPtr());
ItemType item = nodePtr->getItem();
visit(item);
}
// Prints tree as an indented list
template<class ItemType>
void BinaryTree<ItemType>::_printTree(void visit(const ItemType &, int), BinaryNode<ItemType> *nodePtr, int level) const {
if (nodePtr == nullptr) return;
ItemType item = nodePtr->getItem();
visit(item, level);
_printTree(visit, nodePtr->getRightPtr(), level + 1);
_printTree(visit, nodePtr->getLeftPtr(), level + 1);
}
// Prints inner nodes
template<class ItemType>
void BinaryTree<ItemType>::_printInnerNodes(void visit(const ItemType &), BinaryNode<ItemType> *nodePtr) const {
if (nodePtr == nullptr || nodePtr->isLeaf()) return;
ItemType item = nodePtr->getItem();
_printInnerNodes(visit, nodePtr->getLeftPtr());
visit(item);
_printInnerNodes(visit, nodePtr->getRightPtr());
}
#endif