Practical No 3
Practical No 3
#include<vector>
#include<algorithm>
using namespace std;
class TreeNode
{
private:
int data;
TreeNode* left;
TreeNode* right;
public:
TreeNode() : data(0), left(NULL), right(NULL) {}
TreeNode(int value) : data(value), left(NULL), right(NULL) {}
class BinaryTree
{
private:
TreeNode* root;
vector<int> leaf;
vector<int> internal;
char choice;
cout << "Current node: " << node->data << ". Insert " << value << " to the left or
right? (l/r): ";
cin >> choice;
return node;
}
inorderTraversal(node->left);
cout << node->data << " ";
inorderTraversal(node->right);
}
countLeavesAndInternal(node->left);
countLeavesAndInternal(node->right);
}
eraseTree(node->left);
eraseTree(node->right);
delete node;
}
mirror(node->left);
mirror(node->right);
}
public:
BinaryTree() : root(NULL) {}
void inorderTraversal()
{
inorderTraversal(root);
cout << endl;
}
BinaryTree copyTree()
{
BinaryTree newTree;
newTree.root = copyTree(root);
return newTree;
}
void countLeavesAndInternal()
{
leaf.clear();
internal.clear();
countLeavesAndInternal(root);
}
void eraseTree()
{
eraseTree(root);
root = NULL;
}
void printLeaves()
{
cout << "Leaf nodes: ";
for (int value : leaf)
{
cout << value << " ";
}
cout << endl;
}
void printInternal()
{
cout << "Internal nodes: ";
for (int value : internal)
{
cout << value << " ";
}
cout << endl;
}
int getHeight()
{
return height(root);
}
void mirrorTree()
{
mirror(root);
}
~BinaryTree()
{
eraseTree();
}
};
int main()
{
BinaryTree tree;
int value;
char cont = 'y';
cout << "Do you want to add another node? (y/n): ";
cin >> cont;
}
tree.countLeavesAndInternal();
tree.printLeaves();
tree.printInternal();
cout << "Height of the tree: " << tree.getHeight() << endl;
tree.mirrorTree();
cout << "In-order traversal after mirroring the tree: ";
tree.inorderTraversal();
tree.eraseTree();
cout << "In-order traversal of erased tree: ";
tree.inorderTraversal();
return 0;
}