A Binary tree is a tree in which any node can have at max 2 nodes which are known as left subtree and right subtree. If each node of a binary tree contains Zero or Two nodes then this binary tree is known as proper binary tree else it will be called improper binary tree.
Typically a binary tree can be shown as follows:
As shown in above diagram “Software” is the Root node whose left child is “Trial Version” and right child is “Paid Version”.
A Binary Tree can be defined as follows:
// Struct definition of Binary Tree struct BinaryTree { int data; BinaryTree* left; BinaryTree* right; };
Traversing a Tree:
Accessing or visiting each and every node of a tree is known as traversal of a tree.
Basically there are three kind of traversal mechanism:
1) Preorder traversal(root, left, right):
In this kind of traversal root/parent node is traversed first and then its left and right childrens. So for above shown picture preorder traversal would be as follows:
Software, Trial Version, Student Copy, Home Copy, Paid Version, Commercial Version, Enterprise Version.
2) Postorder traversal(left, right, root):
In this kind of traversal root/parent node is traversed after all its children are traversed. So for above shown picture postorder traversal would be as follows:
Student Copy, Home Copy, Trial Version, Commercial Version, Enterprise Version, Paid Version, Software.
3) Inorder traversal(left, root, right):
In this kind of traversal first left child then parent node and right child are traversed. So for above shown picture inorder traversal would be as follows:
Student Copy, Trial Version, Home Copy, Software, Commercial Version, Paid Version, Enterprise Version.
Now that we understood basic concept of Binary Tree, let’s have a look on below binary tree structure as shown in below image.
Now lets have a look at the basic code to create above shown binary tree.
// Create binary tree and returns root node BinaryTree* createRandomBinaryTree() { BinaryTree* root = new BinaryTree; root->data = 10; root->left = NULL; root->right = NULL; // Adding 2 nodes(2,4) as left and right child of root BinaryTree* temp = new BinaryTree(); temp->data = 2; temp->left = NULL; temp->right = NULL; root->left = temp; //Create next node (4) temp = new BinaryTree(); temp->data = 4; temp->left = NULL; temp->right = NULL; root->right = temp; //Create next node (7) as left child of (2) temp = new BinaryTree(); temp->data = 7; temp->left = NULL; temp->right = NULL; root->left->left = temp; // Create next node (8) as right child of (4) temp = new BinaryTree(); temp->data = 8; temp->left = NULL; temp->right = NULL; root->right->right = temp; return root; }
Preorder traversal of above shown tree would be as follows:
10, 2, 7, 4, 8.
Now let’s have a look at the code for preorder traversal of a tree.
// Function to preorder traversal. Root Node MUST be passed to this function void preOrderBinaryTree(BinaryTree* node) { cout << "Preorder Node Data is : " << node->data << endl; if (node->left) { preOrderBinaryTree(node->left); } if (node->right) { preOrderBinaryTree(node->right); } }
Postorder traversal of above shown tree would be as follows:
7, 2, 8, 4, 10.
Now let’s have a look at the code for postorder traversal of a tree.
// Function to postorder traversal. Root Node MUST be passed to this function void postOrderBinaryTree(BinaryTree* node) { if (node->left) { postOrderBinaryTree(node->left); } if (node->right) { postOrderBinaryTree(node->right); } cout << "Postorder Node Data is : " << node->data << endl; }
Inorder traversal of above shown tree would be as follows:
7, 2, 10, 4, 8.
Now let’s have a look at the code for inorder traversal of a tree.
// Function to inorder traversal. Root Node MUST be passed to this function void inOrderBinaryTree(BinaryTree* node) { if (node->left) { inOrderBinaryTree(node->left); } cout << "Inorder Node Data is : " << node->data << endl; if (node->right) { inOrderBinaryTree(node->right); } }
For deleting this entire tree, we can write some function which uses any of the above mentioned traversal technique as shown below:
// Function to delete binary tree. Root Node MUST be passed to this function void deleteBinaryTree(BinaryTree* node) { if (node->left) { deleteBinaryTree(node->left); } if (node->right) { deleteBinaryTree(node->right); } cout << "Deleting Node Data is : " << node->data << endl; delete node; }
Now, let’s have a look at the sample main function which uses all the above functions:
int main() { BinaryTree* root; root = createRandomBinaryTree(); preOrderBinaryTree(root); inOrderBinaryTree(root); postOrderBinaryTree(root); deleteBinaryTree(root); cout << "All Node data printed" << endl; }
Output of above program is as follows:
Preorder Node Data is : 10 Preorder Node Data is : 2 Preorder Node Data is : 7 Preorder Node Data is : 4 Preorder Node Data is : 8 Inorder Node Data is : 7 Inorder Node Data is : 2 Inorder Node Data is : 10 Inorder Node Data is : 4 Inorder Node Data is : 8 Postorder Node Data is : 7 Postorder Node Data is : 2 Postorder Node Data is : 8 Postorder Node Data is : 4 Postorder Node Data is : 10 Deleting Node Data is : 7 Deleting Node Data is : 2 Deleting Node Data is : 8 Deleting Node Data is : 4 Deleting Node Data is : 10 All Node data printed