8.4 Lab: BT - Traversals (in-, post-, and pre-Order) - Version 2

This commit is contained in:
Iurii Tatishchev 2024-05-03 12:34:37 -07:00
parent 6f5d2f2d5e
commit 41c45e09fb
Signed by: CaZzzer
GPG Key ID: 28BE602058C08557
3 changed files with 63 additions and 34 deletions

View File

@ -18,61 +18,68 @@ BinaryTree::BinaryTree() {
/**~*~* /**~*~*
This function calls a recursive function to traverse the This function calls a recursive function to traverse the
tree in postorder (the wrapper function) tree in postorder
*~**/ *~**/
void BinaryTree::postOrder() const { void BinaryTree::postOrder(void visit(const Data &)) const {
_postOrder(root); _postOrder(root, visit);
} }
/**~*~* /**~*~*
Postorder Traversal of the Binary Tree: Postorder Traversal of the Binary Tree:
Left-Right-Root (recursive) Left-Right-Root
*~**/ *~**/
void BinaryTree::_postOrder(BinaryTree::Node *root) const { void BinaryTree::_postOrder(BinaryTree::Node *root, void visit(const Data &)) const {
if (root == nullptr) return; if (root == nullptr) return;
_postOrder(root->left); _postOrder(root->left, visit);
_postOrder(root->right); _postOrder(root->right, visit);
cout << root->data.num << " "; visit(root->data);
} }
/**~*~* /**~*~*
This function calls a recursive function to traverse the This function calls a recursive function to traverse the
tree in preorder (the wrapper function) tree in preorder
*~**/ *~**/
void BinaryTree::preOrder() const { void BinaryTree::preOrder(void visit(const Data &)) const {
_preOrder(root); _preOrder(root, visit);
} }
/**~*~* /**~*~*
Preorder Traversal of the Binary Tree: Postorder Traversal of the Binary Tree:
Root-Left-Right (recursive) Left-Right-Root
*~**/ *~**/
void BinaryTree::_preOrder(BinaryTree::Node *root) const { void BinaryTree::_preOrder(BinaryTree::Node *root, void visit(const Data &)) const {
if (root == nullptr) return; if (root == nullptr) return;
cout << root->data.num << " "; visit(root->data);
_preOrder(root->left); _preOrder(root->left, visit);
_preOrder(root->right); _preOrder(root->right, visit);
} }
/**~*~* /**~*~*
This function calls a recursive function to traverse the This function calls a recursive function to traverse the
tree in inorder (the wrapper function) tree in inorder
*~**/ *~**/
void BinaryTree::inOrder() const { void BinaryTree::inOrder(void visit(const Data &)) const {
_inOrder(root); _inOrder(root, visit);
} }
/**~*~* /**~*~*
Inorder Traversal of the Binary Tree: Inorder Traversal of the Binary Tree:
Left-Root-Right (recursive) Left-Root-Right
*~**/ *~**/
void BinaryTree::_inOrder(Node *root) const { void BinaryTree::_inOrder(Node *root, void visit(const Data &)) const {
if (root) { if (root) {
_inOrder(root->left); _inOrder(root->left, visit);
cout << root->data.num << " "; //cout << root->data.num << " ";
_inOrder(root->right); visit(root->data);
// cout has been replaced with a call for visit
// What is visit?
// visit is a generic name for a display function
// in main(), when inOrder is called, it is decided what function address to assign to visit
// here, you just use visit the way you would use/call a function
_inOrder(root->right, visit);
// ------------------^^^^^^ visit as an argument
} }
} }

View File

@ -28,18 +28,18 @@ public:
// Binary Tree operations // Binary Tree operations
void insert(Data dataIn); void insert(Data dataIn);
void inOrder() const; void inOrder(void visit(const Data &)) const;
void preOrder() const; void preOrder(void visit(const Data &)) const;
void postOrder() const; void postOrder(void visit(const Data &)) const;
private: private:
void _inOrder(Node *root) const; void _inOrder(Node *root, void visit(const Data &)) const;
void _preOrder(Node *root) const; void _preOrder(Node *root, void visit(const Data &)) const;
void _postOrder(Node *root) const; void _postOrder(Node *root, void visit(const Data &)) const;
void _destroy(Node *root); void _destroy(Node *root);
}; };

View File

@ -22,6 +22,9 @@ using namespace std;
void build_BT(BinaryTree &tree, int n); void build_BT(BinaryTree &tree, int n);
void hDisplay(const Data &item); // horizontal display: all items on one line
void vDisplay(const Data &item); // vertical display: one item per line
int main(void) { int main(void) {
BinaryTree tree; BinaryTree tree;
int n; // number of nodes int n; // number of nodes
@ -34,17 +37,21 @@ int main(void) {
build_BT(tree, n); build_BT(tree, n);
cout << " Inorder: "; cout << " Inorder: ";
tree.inOrder(); tree.inOrder(hDisplay); // hDisplay is the inOrder's argument
cout << endl; cout << endl;
if (option == 'T' || option == 't') { if (option == 'T' || option == 't') {
cout << "Postorder: "; cout << "Postorder: ";
tree.postOrder(); tree.postOrder(hDisplay); // passing hDisplay to postOrder
cout << endl;
tree.postOrder(vDisplay); // passing vDisplay to postOrder
cout << endl; cout << endl;
} }
if (option == 'E' || option == 'e') { if (option == 'E' || option == 'e') {
cout << " Preorder: "; cout << " Preorder: ";
tree.preOrder(); tree.preOrder(hDisplay); // passing hDisplay to preOrder
cout << endl;
tree.preOrder(vDisplay); // passing vDisplay to preOrder
cout << endl; cout << endl;
} }
return 0; return 0;
@ -66,3 +73,18 @@ void build_BT(BinaryTree &tree, int n) {
tree.insert(data); tree.insert(data);
} }
} }
// The following two functions are used as arguments to other functions
/**~*~*
horizontal display: all items on one line
*/
void hDisplay(const Data &item) {
cout << item.num << " ";
}
/**~*~*
// vertical display: one item per line
*/
void vDisplay(const Data &item) {
cout << item.num << endl;
}