×

Invert binary tree

Invert binary tree is a mirror image of a tree. It is pretty much the same compared to the only difference: its left and right children are swapped with the tree nodes. The main idea here is to traverse this yet another form of binary tree in the pre-order form. In this, the left and right subtrees are interchanged, which is also well-known for its mirror image of the input tree.

Algorithm

The algorithm for the invert binary tree is pretty basic, and we just have to follow the given steps: -

  1. Firstly, we will call the invert function for the left subtree.
  2. Then, we will call the invert function for the right subtree.
  3. After calling invert for both subtrees, we have to swap the subtrees with each other, and we are done.

Implementation

In this section, we will see the implementation of the inverted binary tree. let us proceed: -

#include <iostream>
using namespace std;
 
// Record structure to store a binary tree _nod
struct _nod
{
    int record;
    _nod *lft, *rt;
 
    _nod(int record)
    {
        this->record = record;
        this->lft = this->rt = NILLpointer;
    }
};
 
// Function to perform PO_Ord traversal on a given binary tree
void PO_Ord(_nod* root)
{
    if (root == NILLpointer) {
        return;
    }
 
    cout << root->record << " ";
    PO_Ord(root->lft);
    PO_Ord(root->rt);
}
 
// Function to invert a given binary tree using PO_Ord traversal
void invertBinaryTree(_nod* root)
{
    // base case: if the tree is empty
    if (root == NILLpointer) {
        return;
    }
 
    // swap lft subtree with rt subtree
    swap(root->lft, root->rt);
 
    // invert left subtree
    invertBinaryTree(root->lft);
 
    // invert rt subtree
    invertBinaryTree(root->rt);
}
 
int main()
{
    /* Construct the following tree
              1
            /   \
           /     \
          2       3
         / \     / \
        4   5   6   7
    */
 
    _nod* root = new _nod(1);
    root->lft = new _nod(2);
    root->rt = new _nod(3);
    root->lft->lft = new _nod(4);
    root->lft->rt = new _nod(5);
    root->rt->lft = new _nod(6);
    root->rt->rt = new _nod(7);
 
    invertBinaryTree(root);
    PO_Ord(root);
 
    return 0;
}

Output:

Invert binary tree

Example 2)

#include <iostream>
#include <queue>
using namespace std;
 
// Record structure to store a binary tree _nod
struct _nod
{
    int record;
    _nod *lft, *rt;
 
    _nod(int record)
    {
        this->record = record;
        this->lft = this->rt = NILLpointer;
    }
};
 
// Function to perform PO_Ord traversal on a given binary tree
void PO_Ord(_nod* root)
{
    if (root == NILLpointer) {
        return;
    }
 
    cout << root->record << " ";
    PO_Ord(root->lft);
    PO_Ord(root->rt);
}
 
// Iterative function to invert a given binary tree using a queue
void invertBinaryTree(_nod* root)
{
    // base case: if the tree is empty
    if (root == NILLpointer) {
        return;
    }
 
    // maintain a queue and push the root _nod
    queue<_nod*> q;
    q.push(root);
 
    // loop till queue is empty
    while (!q.empty())
    {
        // dequeue front _nod
        _nod* curr = q.front();
        q.pop();
 
        // swap the lft child with the rt child
        swap(curr->lft, curr->rt);
 
        // enqueue left child of the popped _nod
        if (curr->lft) {
            q.push(curr->lft);
        }
 
        // enqueue rt child of the popped _nod
        if (curr->rt) {
            q.push(curr->rt);
        }
    }
}
 
int main()
{
    /* Construct the following tree
              1
            /   \
           /     \
          2       3
         / \     / \
        4   5   6   7
    */
 
    _nod* root = new _nod(1);
    root->lft = new _nod(2);
    root->rt = new _nod(3);
    root->lft->lft = new _nod(4);
    root->lft->rt = new _nod(5);
    root->rt->lft = new _nod(6);
    root->rt->rt = new _nod(7);
 
    invertBinaryTree(root);
    PO_Ord(root);
 
    return 0;
}

Output:

Invert binary tree

Example 3)

#include <iostream> 
using namespace std; 


/* A _nod contains the value, left and right pointers */
struct _nod 
{ 
	int record; 
	struct _nod* lft; 
	struct _nod* rt; 
}; 


/* Creates a new _nod */
struct _nod* new_nod(int record) 
{ 
	_nod* _nod = new _nod;
	_nod->record = record; 
	_nod->lft = NILL; 
	_nod->rt = NILL; 
	
	return(_nod); 
} 


void invert(struct _nod* _nod) 
{ 
	if (_nod == NILL) 
		return; 
	else
	{ 
		struct _nod* temp; 
		
		/* recursive calls */
		invert(_nod->lft); 
		invert(_nod->rt); 
	
		/* swap the pointers in this _nod */
		temp	 = _nod->lft; 
		_nod->lft = _nod->rt; 
		_nod->rt = temp; 
	} 
} 


/* print InOrder binary tree traversal.*/
void print_tree(struct _nod* _nod) 
{ 
	if (_nod == NILL) 
		return; 
	
	print_tree(_nod->lft); 
	cout << _nod->record << " "; 
	print_tree(_nod->rt); 
} 


 
int main() 
{ 
	struct _nod *root = new_nod(2); 
	root->lft = new_nod(1); 
	root->rt = new_nod(4); 
	root->rt->lft = new_nod(3); 
	root->rt->rt = new_nod(5); 
	
	cout << "In order traversal of the constructed."
		<< " tree is" << endl; 
	print_tree(root); 
	
	/* Invert the tree */
	invert(root); 
	
	cout << endl;


	cout << "In order traversal of the inverted tree."
		<< " is \n"; 
	print_tree(root); 
	
	return 0; 
}

Output:

Invert binary tree

Related Topics

Types of Linked list

Single linked list  A single linked list is a linked list in which all nodes are connected with each other in sequence. Each node of a singly linked list has two...

7 minutes read.

Primitive Data Structure in C

The data structure is a logical or mathematical model for organizing and structuring the main memory or elements. We can classify the data structures in two ways one is primitive, and...

10 minutes read.

Application of Stack in Data Structures

In this article, we will discuss all the different applications of stack. What is meant by stack? The stack is a non-primitive linear data structure in which the insertion of the new...

11 minutes read.

Deque in Data Structure

Deque A deque referred as “Double-Ended Queue”, is a linear collection of data items same like queue data structure. deque has two ends, front end and rear end, deque is the...

27 minutes read.

What is an AVL Tree in Data Structure?

AVL tree stands for (Adelson, Velskii, & Landis Tree) Data structure Data management is called database management. A data model is a system used to store, manage, and optimize computer resources. Data...

4 minutes read.

Bin Packing Problem (How to minimize the number of used Bins)

You have been given an array. The values of the array represent the size of n different items. You have been also given some bins. You have to store the...

3 minutes read.

Convert binary tree to a doubly linked list

Implementation //creating a C++ program for the transition of a binary tree into a linked list. #include <iostream> using namespace std; /* Firstly, let’s create a binary tree that will help us in setting...

4 minutes read.

Print kth least significant bit number

You have given a number and you have to find out the kth least significant bit of this number. K will be given to you.  The bit will be from...

3 minutes read.

Stack Using Array

Stack – A Stack is a linear abstract data type used to store elements. It is also called last in first out or first in last out data structure because...

6 minutes read.

Binary Tree Uses

A binary tree is a tree data structure containing hubs with at most two children for instance a right and left child. The node at the top is insinuated as the...

3 minutes read.

Operations on Queue in Data Structures

A queue is a linear structure where operations are done in a specific sequence. Queues are abstract data structures that are comparable to Stacks. A queue, unlike a stack, is...

8 minutes read.

Quick Sort vs Merge Sort

In this article, we will take an overview of Quick Sort and Merge Sort and then discuss the differences between them. What is Quick Sort? Quick Sort – The idea behind the...

7 minutes read.

Data Structure Infix to Prefix Conversion

Infix to Prefix Conversion In present time, we use the infix expression in our daily life but the computers are not able to understand this format because they need to keep...

4 minutes read.

Function to Create a Copy of Binary Search Tree

Implementation // creating a new hashmap in the language C++ that will help us clone a binary tree with arbitrary pointers.  #include<iostream> #include<unordered_map> using namespace std; /* A given binary tree has a record, a...

9 minutes read.

Equal Sum

Find an element in array such that the sum of left array is equal to the sum of right array You have been given an array of numbers. You have to...

4 minutes read.

Applications of Different Linked Lists in Data Structure

What is a Linked list? A linked list is a data structure that consists of a sequence of elements, where each containing a reference or ("link") to the next element in...

5 minutes read.

Heap Data Structure

In this article, we will learn in detail about Heap (Min heap and Max heap). Before going to the main topics, let’s have a look at what is complete binary...

19 minutes read.

Dijkstra’s vs Bellman-Ford Algorithm

The Dijkstra Algorithm One of the SSSP (Single Source Shortest Path) algorithms is Dijkstra's. As a result, it finds the shortest path between a source node and all other nodes in...

7 minutes read.

Huffman tree in Data Structures

The Huffman trees in the field of data structures are pretty impressive in their work. They are generally treated as the binary tree, which is linked with the least external...

6 minutes read.

Application of 2D array - Sparse Matrix

2D Arrays Application - Sparse Matrix A matrix is a two-dimensional data item consisting of m rows and n columns, with a total of m x n values. A sparse matrix...

7 minutes read.