Question: The task is to create a Menu using the templetes to store strings on the tree >>>>>> (The tree is used store strings names) 1.

The task is to create a Menu using the templetes to store strings on the tree >>>>>> (The tree is used store strings names) 1. The program should present the user with a menu as follows: Any other 1. Add a new name 2. Delete a name 3. List the contents in ascending order 4. Display the number of nodes in the tree 5. Display the number of leafs 6. Exit the system)<<<<<<

C++ Create a program that uses this class as follows (The tree is used store strings names) 1. The program should present the user with a menu as follows: Any other 1. Add a new name 2. Delete a name 3. List the contents in ascending order 4. Display the number of nodes in the tree 5. Display the number of leafs 6. Exit the system Please enter your choice 2. Create a function for each option on the menu to handle the request. 3. For choice # 1 (Add a new value), the function should prompt the user to enter a value (a string). If the value is already stored in the tree, you should display a message that indicates that. 4. For choice # 2 (Delete a value), the function should prompt the user to enter a value (a string). Display a message to indicate if the value is found and deleted or if it is not found. 5. Main() should call a function called menu() to display the menu and return users input. Main() should not handle any input or output other than reading and validating users input. 6. You need to submit the class files, main(), and the executable file. Using THAT HEADER FILE

#include

#include

#include

#include

#ifndef genBST_h

#define genBST_h

using namespace std;

struct node

{

int data;

struct node *next;

} *head;

template

class Stack : public stack {

public:

T pop() {

T tmp = pop();

Stack::pop();

return tmp;

}

};

template

class Queue : public queue {

public:

T dequeue() {

T tmp = queue::front();

queue::pop();

return tmp;

}

void enqueue(const T& el) {

push(el);

}

};

template class BST;

template

class BSTNode {

public:

BSTNode() {

left = right = 0;

}

BSTNode(const T& e, BSTNode *l = 0, BSTNode *r = 0) {

el = e; left = l; right = r;

}

T el;

BSTNode *left, *right;

};

template

class BST {

public:

BST() {

root = 0;

}

~BST() {

clear();

}

void clear() {

clear(root);

root = 0;

}

bool isEmpty() const {

return root == 0;

}

void preorder() {

preorder(root);

}

void inorder() {

inorder(root);

}

void postorder() {

postorder(root);

}

void insert(const T&);

void recursiveInsert(const T& el) {

recursiveInsert(root,el);

}

T* search(const T& el) const {

return search(root,el);

}

T* recursiveSearch(const T& el) const {

return recursiveSearch(root,el);

}

void deleteByCopying(BSTNode*&);

void findAndDeleteByCopying(const T&);

void deleteByMerging(BSTNode*&);

void findAndDeleteByMerging(const T&);

void iterativePreorder();

void iterativeInorder();

void iterativePostorder();

void breadthFirst();

void MorrisPreorder();

void MorrisInorder();

void MorrisPostorder();

void balance(T*,int,int);

void AddName(string name);

int nodecount(BSTNode* p);

int leavescount(BSTNode* p);

void Display();

protected:

BSTNode* root;

void clear(BSTNode*);

void recursiveInsert(BSTNode*&, const T&);

T* search(BSTNode*, const T&) const;

T* recursiveSearch(BSTNode*, const T&) const;

void preorder(BSTNode*);

void inorder(BSTNode*);

void postorder(BSTNode*);

//////////////////////////////////////

virtual void visit(BSTNode* p) {

cout << p->el << ' ';

}

};

template

void BST::clear(BSTNode *p) {

if (p != 0) {

clear(p->left);

clear(p->right);

delete p;

}

}

template

void BST::insert(const T& el) {

BSTNode *p = root, *prev = 0;

while (p != 0) { // find a place for inserting new node;

prev = p;

if (el < p->el)

p = p->left;

else p = p->right;

}

if (root == 0) // tree is empty;

root = new BSTNode(el);

else if (el < prev->el)

prev->left = new BSTNode(el);

else prev->right = new BSTNode(el);

}

template

void BST::recursiveInsert(BSTNode*& p, const T& el) {

if (p == 0)

p = new BSTNode(el);

else if (el < p->el)

recursiveInsert(p->left, el);

else recursiveInsert(p->right,el);

}

template

T* BST::search(BSTNode* p, const T& el) const {

while (p != 0)

if (el == p->el)

return &p->el;

else if (el < p->el)

p = p->left;

else p = p->right;

return 0;

}

template

T* BST::recursiveSearch(BSTNode* p, const T& el) const {

if (p != 0)

if (el == p->el)

return &p->el;

else if (el < p->el)

return recursiveSearch(p->left,el);

else return recursiveSearch(p->right,el);

else return 0;

}

template

void BST::inorder(BSTNode *p) {

if (p != 0) {

inorder(p->left);

visit(p);

inorder(p->right);

}

}

template

void BST::preorder(BSTNode *p) {

if (p != 0) {

visit(p);

preorder(p->left);

preorder(p->right);

}

}

template

void BST::postorder(BSTNode* p) {

if (p != 0) {

postorder(p->left);

postorder(p->right);

visit(p);

}

}

template

void BST::deleteByCopying(BSTNode*& node) {

BSTNode *previous, *tmp = node;

if (node->right == 0) // node has no right child;

node = node->left;

else if (node->left == 0) // node has no left child;

node = node->right;

else {

tmp = node->left; // node has both children;

previous = node; // 1.

while (tmp->right != 0) { // 2.

previous = tmp;

tmp = tmp->right;

}

node->el = tmp->el; // 3.

if (previous == node)

previous->left = tmp->left;

else previous->right = tmp->left; // 4.

}

delete tmp; // 5.

}

// findAndDeleteByCopying() searches the tree to locate the node containing

// el. If the node is located, the function DeleteByCopying() is called.

template

void BST::findAndDeleteByCopying(const T& el) {

BSTNode *p = root, *prev = 0;

while (p != 0 && !(p->el == el)) {

prev = p;

if (el < p->el)

p = p->left;

else p = p->right;

}

if (p != 0 && p->el == el)

if (p == root)

deleteByCopying(root);

else if (prev->left == p)

deleteByCopying(prev->left);

else deleteByCopying(prev->right);

else if (root != 0)

cout << "el " << el << " is not in the tree ";

else cout << "the tree is empty ";

}

template

void BST::deleteByMerging(BSTNode*& node) {

BSTNode *tmp = node;

if (node != 0) {

if (!node->right) // node has no right child: its left

node = node->left; // child (if any) is attached to its parent;

else if (node->left == 0) // node has no left child: its right

node = node->right; // child is attached to its parent;

else { // be ready for merging subtrees;

tmp = node->left; // 1. move left

while (tmp->right != 0)// 2. and then right as far as possible;

tmp = tmp->right;

tmp->right = // 3. establish the link between the

node->right; // the rightmost node of the left

// subtree and the right subtree;

tmp = node; // 4.

node = node->left; // 5.

}

delete tmp; // 6.

}

}

template

void BST::findAndDeleteByMerging(const T& el) {

BSTNode *node = root, *prev = 0;

while (node != 0) {

if (node->el == el)

break;

prev = node;

if (el < node->el)

node = node->left;

else node = node->right;

}

if (node != 0 && node->el == el)

if (node == root)

deleteByMerging(root);

else if (prev->left == node)

deleteByMerging(prev->left);

else deleteByMerging(prev->right);

else if (root != 0)

cout << "el " << el << " is not in the tree ";

else cout << "the tree is empty ";

}

template

void BST::iterativePreorder() {

stack*> travStack;

BSTNode *p = root;

if (p != 0) {

travStack.push(p);

while (!travStack.empty()) {

p = travStack.pop();

visit(p);

if (p->right != 0)

travStack.push(p->right);

if (p->left != 0) // left child pushed after right

travStack.push(p->left); // to be on the top of the stack;

}

}

}

template

void BST::iterativeInorder() {

stack*> travStack;

BSTNode *p = root;

while (p != 0) {

while (p != 0) { // stack the right child (if any)

if (p->right) // and the node itself when going

travStack.push(p->right); // to the left;

travStack.push(p);

p = p->left;

}

p = travStack.pop(); // pop a node with no left child

while (!travStack.empty() && p->right == 0) { // visit it and all nodes

visit(p); // with no right child;

p = travStack.pop();

}

visit(p); // visit also the first node with

if (!travStack.empty()) // a right child (if any);

p = travStack.pop();

else p = 0;

}

}

template

void BST::iterativePostorder() {

stack*> travStack;

BSTNode* p = root, *q = root;

while (p != 0) {

for ( ; p->left != 0; p = p->left)

travStack.push(p);

while (p->right == 0 || p->right == q) {

visit(p);

q = p;

if (travStack.empty())

return;

p = travStack.pop();

}

travStack.push(p);

p = p->right;

}

}

template

void BST::breadthFirst() {

Queue*> queue;

BSTNode *p = root;

if (p != 0) {

queue.enqueue(p);

while (!queue.empty()) {

p = queue.dequeue();

visit(p);

if (p->left != 0)

queue.enqueue(p->left);

if (p->right != 0)

queue.enqueue(p->right);

}

}

}

template

void BST::MorrisInorder() {

BSTNode *p = root, *tmp;

while (p != 0)

if (p->left == 0) {

visit(p);

p = p->right;

}

else {

tmp = p->left;

while (tmp->right != 0 &&// go to the rightmost node of

tmp->right != p) // the left subtree or

tmp = tmp->right; // to the temporary parent of p;

if (tmp->right == 0) { // if 'true' rightmost node was

tmp->right = p; // reached, make it a temporary

p = p->left; // parent of the current root,

}

else { // else a temporary parent has been

visit(p); // found; visit node p and then cut

tmp->right = 0; // the right pointer of the current

p = p->right; // parent, whereby it ceases to be

} // a parent;

}

}

template

void BST::MorrisPreorder() {

BSTNode *p = root, *tmp;

while (p != 0) {

if (p->left == 0) {

visit(p);

p = p->right;

}

else {

tmp = p->left;

while (tmp->right != 0 &&// go to the rightmost node of

tmp->right != p) // the left subtree or

tmp = tmp->right; // to the temporary parent of p;

if (tmp->right == 0) { // if 'true' rightmost node was

visit(p); // reached, visit the root and

tmp->right = p; // make the rightmost node a temporary

p = p->left; // parent of the current root,

}

else { // else a temporary parent has been

tmp->right = 0; // found; cut the right pointer of

p = p->right; // the current parent, whereby it ceases

} // to be a parent;

}

}

}

template

void BST::MorrisPostorder() {

BSTNode *p = new BSTNode(), *tmp, *q, *r, *s;

p->left = root;

while (p != 0)

if (p->left == 0)

p = p->right;

else {

tmp = p->left;

while (tmp->right != 0 &&// go to the rightmost node of

tmp->right != p) // the left subtree or

tmp = tmp->right; // to the temporary parent of p;

if (tmp->right == 0) { // if 'true' rightmost node was

tmp->right = p; // reached, make it a temporary

p = p->left; // parent of the current root,

}

else { // else a temporary parent has been found;

// process nodes between p->left (included) and p (excluded)

// extended to the right in modified tree in reverse order;

// the first loop descends this chain of nodes and reverses

// right pointers; the second loop goes back, visits nodes,

// and reverses right pointers again to restore the pointers

// to their original setting;

for (q = p->left, r = q->right, s = r->right;

r != p; q = r, r = s, s = s->right)

r->right = q;

for (s = q->right; q != p->left;

q->right = r, r = q, q = s, s = s->right)

visit(q);

visit(p->left); // visit node p->left and then cut

tmp->right = 0; // the right pointer of the current

p = p->right; // parent, whereby it ceases to be

} // a parent;

}

}

template

void BST::balance (T data[], int first, int last) {

if (first <= last) {

int middle = (first + last)/2;

insert(data[middle]);

balance(data,first,middle-1);

balance(data,middle+1,last);

}

}

////////////////////////////////////

template

int BST::nodecount(BSTNode* p) {

int count=1;

if (p ==NULL){

return 0;

}

else{

count+=nodecount(p->left);

count+=nodecount(p->right);

}

return count;

}

template

int BST::leavescount(BSTNode* p){

if (p==NULL){

return 0;

}

if(p->left==NULL && p->right==NULL){

return 1;

}

else{

return (leafcount(p->left)+ leafcount(p->right));

}

}

file.

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!