Iterative function to check if two trees are identical - GeeksforGeeks

25 Jun, 2021
Two trees are identical when they have same data and arrangement of data is also same. To identify if two trees are identical, we need to traverse both trees simultaneously, and while traversing we need to compare data and children of the trees. Examples:  
Input : Roots of below trees
    10           10
  /   \         /
 5     6       5 
Output : false

Input : Roots of below trees
    10            10
  /   \         /   \
 5     6       5     6
Output : true
 
We have discussed recursive solution here. In this article iterative solution is discussed. The idea is to use level order traversal. We traverse both trees simultaneously and compare the data whenever we dequeue and item from queue. Below is the implementation of the idea.  
C++
Java
Python3
C#
Javascript
/* Iterative C++ program to check if two */#include <bits/stdc++.h>using namespace std; // A Binary Tree Nodestruct Node{    int data;    struct Node *left, *right;}; // Iterative method to find height of Binary Treebool areIdentical(Node *root1, Node *root2){    // Return true if both trees are empty    if (root1==NULL  && root2==NULL) return true;     // Return false if one is empty and other is not    if (root1 == NULL) return false;    if (root2 == NULL) return false;         // Create an empty queues for simultaneous traversals    queue<Node *> q1, q2;     // Enqueue Roots of trees in respective queues    q1.push(root1);    q2.push(root2);     while (!q1.empty() && !q2.empty())    {        // Get front nodes and compare them        Node *n1 = q1.front();        Node *n2 = q2.front();         if (n1->data != n2->data)           return false;         // Remove front nodes from queues        q1.pop(), q2.pop();         /* Enqueue left children of both nodes */        if (n1->left && n2->left)        {            q1.push(n1->left);            q2.push(n2->left);        }         // If one left child is empty and other is not        else if (n1->left || n2->left)            return false;         // Right child code (Similar to left child code)        if (n1->right && n2->right)        {            q1.push(n1->right);            q2.push(n2->right);        }        else if (n1->right || n2->right)            return false;    }     return true;} // Utility function to create a new tree nodeNode* newNode(int data){    Node *temp = new Node;    temp->data = data;    temp->left = temp->right = NULL;    return temp;} // Driver program to test above functionsint main(){    Node *root1 = newNode(1);    root1->left = newNode(2);    root1->right = newNode(3);    root1->left->left = newNode(4);    root1->left->right = newNode(5);     Node *root2 = newNode(1);    root2->left = newNode(2);    root2->right = newNode(3);    root2->left->left = newNode(4);    root2->left->right = newNode(5);     areIdentical(root1, root2)? cout << "Yes"                              : cout << "No";    return 0;}
/* Iterative Java program to check if two */import java.util.*;class GfG { // A Binary Tree Nodestatic class Node{    int data;    Node left, right;} // Iterative method to find height of Binary Treestatic boolean areIdentical(Node root1, Node root2){    // Return true if both trees are empty    if (root1 == null && root2 == null)  return true;     // Return false if one is empty and other is not    if (root1 == null || root2 == null) return false;     // Create an empty queues for simultaneous traversals    Queue<Node > q1 = new LinkedList<Node> ();    Queue<Node>  q2 = new LinkedList<Node> ();     // Enqueue Roots of trees in respective queues    q1.add(root1);    q2.add(root2);     while (!q1.isEmpty() && !q2.isEmpty())    {        // Get front nodes and compare them        Node n1 = q1.peek();        Node n2 = q2.peek();         if (n1.data != n2.data)        return false;         // Remove front nodes from queues        q1.remove();        q2.remove();         /* Enqueue left children of both nodes */        if (n1.left != null && n2.left != null)        {            q1.add(n1.left);            q2.add(n2.left);        }         // If one left child is empty and other is not        else if (n1.left != null || n2.left != null)            return false;         // Right child code (Similar to left child code)        if (n1.right != null && n2.right != null)        {            q1.add(n1.right);            q2.add(n2.right);        }        else if (n1.right != null || n2.right != null)            return false;    }     return true;} // Utility function to create a new tree nodestatic Node newNode(int data){    Node temp = new Node();    temp.data = data;    temp.left = null;    temp.right = null;    return temp;} // Driver program to test above functionspublic static void main(String[] args){    Node root1 = newNode(1);    root1.left = newNode(2);    root1.right = newNode(3);    root1.left.left = newNode(4);    root1.left.right = newNode(5);     Node root2 = newNode(1);    root2.left = newNode(2);    root2.right = newNode(3);    root2.left.left = newNode(4);    root2.left.right = newNode(5);     if(areIdentical(root1, root2) == true)    System.out.println("Yes");    else    System.out.println("No");}}
# Iterative Python3 program to check# if two trees are identicalfrom queue import Queue # Utility function to create a# new tree nodeclass newNode:    def __init__(self, data):        self.data = data        self.left = self.right = None # Iterative method to find height of# Binary Treedef areIdentical(root1, root2):         # Return true if both trees are empty    if (root1 and root2):        return True     # Return false if one is empty and    # other is not    if (root1 or root2):        return False     # Create an empty queues for    # simultaneous traversals    q1 = Queue()    q2 = Queue()     # Enqueue Roots of trees in    # respective queues    q1.put(root1)    q2.put(root2)     while (not q1.empty() and not q2.empty()):                 # Get front nodes and compare them        n1 = q1.queue[0]        n2 = q2.queue[0]         if (n1.data != n2.data):            return False         # Remove front nodes from queues        q1.get()        q2.get()         # Enqueue left children of both nodes        if (n1.left and n2.left):            q1.put(n1.left)            q2.put(n2.left)         # If one left child is empty and        # other is not        elif (n1.left or n2.left):            return False         # Right child code (Similar to        # left child code)        if (n1.right and n2.right):            q1.put(n1.right)            q2.put(n2.right)        elif (n1.right or n2.right):            return False     return True # Driver Codeif __name__ == '__main__':    root1 = newNode(1)    root1.left = newNode(2)    root1.right = newNode(3)    root1.left.left = newNode(4)    root1.left.right = newNode(5)     root2 = newNode(1)    root2.left = newNode(2)    root2.right = newNode(3)    root2.left.left = newNode(4)    root2.left.right = newNode(5)     if areIdentical(root1, root2):        print("Yes")    else:        print("No")         # This code is contributed by PranchalK
/* Iterative C# program to check if two */using System;using System.Collections.Generic; class GfG{ // A Binary Tree Nodeclass Node{    public int data;    public Node left, right;} // Iterative method to find height of Binary Treestatic bool areIdentical(Node root1, Node root2){    // Return true if both trees are empty    if (root1 == null && root2 == null)        return true;     // Return false if one is empty and other is not    if (root1 == null || root2 == null)        return false;     // Create an empty queues for    // simultaneous traversals    Queue<Node> q1 = new Queue<Node> ();    Queue<Node> q2 = new Queue<Node> ();     // Enqueue Roots of trees in respective queues    q1.Enqueue(root1);    q2.Enqueue(root2);     while (q1.Count != 0 && q2.Count != 0)    {        // Get front nodes and compare them        Node n1 = q1.Peek();        Node n2 = q2.Peek();         if (n1.data != n2.data)        return false;         // Remove front nodes from queues        q1.Dequeue();        q2.Dequeue();         /* Enqueue left children of both nodes */        if (n1.left != null && n2.left != null)        {            q1.Enqueue(n1.left);            q2.Enqueue(n2.left);        }         // If one left child is empty and other is not        else if (n1.left != null || n2.left != null)            return false;         // Right child code (Similar to left child code)        if (n1.right != null && n2.right != null)        {            q1.Enqueue(n1.right);            q2.Enqueue(n2.right);        }        else if (n1.right != null || n2.right != null)            return false;    }     return true;} // Utility function to create a new tree nodestatic Node newNode(int data){    Node temp = new Node();    temp.data = data;    temp.left = null;    temp.right = null;    return temp;} // Driver codepublic static void Main(String[] args){    Node root1 = newNode(1);    root1.left = newNode(2);    root1.right = newNode(3);    root1.left.left = newNode(4);    root1.left.right = newNode(5);     Node root2 = newNode(1);    root2.left = newNode(2);    root2.right = newNode(3);    root2.left.left = newNode(4);    root2.left.right = newNode(5);     if(areIdentical(root1, root2) == true)    Console.WriteLine("Yes");    else    Console.WriteLine("No");}} // This code is contributed by PrinciRaj1992
<script>  /* Iterative Javascript program to check if two */ // A Binary Tree Nodeclass Node{  constructor()  {    this.data = 0;    this.left = null;    this.right = null;  }} // Iterative method to find height of Binary Treefunction areIdentical(root1, root2){    // Return true if both trees are empty    if (root1 == null && root2 == null)        return true;     // Return false if one is empty and other is not    if (root1 == null || root2 == null)        return false;     // Create an empty queues for    // simultaneous traversals    var q1 = [];    var q2 = [];     // push Roots of trees in respective queues    q1.push(root1);    q2.push(root2);     while (q1.length != 0 && q2.length != 0)    {        // Get front nodes and compare them        var n1 = q1[0];        var n2 = q2[0];         if (n1.data != n2.data)        return false;         // Remove front nodes from queues        q1.shift();        q2.shift();         /* push left children of both nodes */        if (n1.left != null && n2.left != null)        {            q1.push(n1.left);            q2.push(n2.left);        }         // If one left child is empty and other is not        else if (n1.left != null || n2.left != null)            return false;         // Right child code (Similar to left child code)        if (n1.right != null && n2.right != null)        {            q1.push(n1.right);            q2.push(n2.right);        }        else if (n1.right != null || n2.right != null)            return false;    }     return true;} // Utility function to create a new tree nodefunction newNode(data){    var temp = new Node();    temp.data = data;    temp.left = null;    temp.right = null;    return temp;} // Driver codevar root1 = newNode(1);root1.left = newNode(2);root1.right = newNode(3);root1.left.left = newNode(4);root1.left.right = newNode(5);var root2 = newNode(1);root2.left = newNode(2);root2.right = newNode(3);root2.left.left = newNode(4);root2.left.right = newNode(5);if(areIdentical(root1, root2) == true)  document.write("Yes");else  document.write("No"); </script>
Output:  
Yes
Time complexity of above solution is O(n + m) where m and n are number of nodes in two trees. 
YouTube<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=ka0tlCl7hwI" target="_blank">Try watching this video on www.youtube.com</a>, or enable JavaScript if it is disabled in your browser.</div></div>
This article is contributed by Ankur Lathiya .If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
prerna saini
princiraj1992
PranchalKatiyar
nobody_cares
nidhi_biet
learningrate
rrrtnx
Tree
Tree
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Binary Tree | Set 3 (Types of Binary Tree)
Binary Tree | Set 2 (Properties)
Decision Tree
A program to check if a binary tree is BST or not
Complexity of different operations in Binary tree, Binary Search Tree and AVL tree
Introduction to Tree Data Structure
Lowest Common Ancestor in a Binary Tree | Set 1
BFS vs DFS for Binary Tree
Expression Tree
Sorted Array to Balanced BST