Check if all levels of two trees are anagrams or not - GeeksforGeeks

15 Sep, 2021
Given two binary trees, we have to check if each of their levels are anagrams of each other or not. Example:  
 
Tree 1:
Level 0 : 1
Level 1 : 3, 2
Level 2 : 5, 4

Tree 2:
Level 0 : 1
Level 1 : 2, 3
Level 2 : 4, 5
As we can clearly see all the levels of above two binary trees are anagrams of each other, hence return true. 
Naive Approach: Below is the step by step explanation of the naive approach to do this:  
Write a recursive program for level order traversal of a tree.Traverse each level of both the trees one by one and store the result of traversals in 2 different vectors, one for each tree.Sort both the vectors and compare them iteratively for each level, if they are same for each level then return true else return false.
Write a recursive program for level order traversal of a tree.
Traverse each level of both the trees one by one and store the result of traversals in 2 different vectors, one for each tree.
Sort both the vectors and compare them iteratively for each level, if they are same for each level then return true else return false.
Time Complexity: O(n^2), where n is the number of nodes.Efficient Approach: The idea is based on below article. Print level order traversal line by line | Set 1 We traverse both trees simultaneously level by level. We store each level both trees in vectors (or array). To check if two vectors are anagram or not, we sort both and then compare.Time Complexity: O(nlogn), where n is the number of nodes.  
C++
Java
Python3
C#
/* Iterative program to check if two trees are level   by level anagram. */#include <bits/stdc++.h>using namespace std; // A Binary Tree Nodestruct Node{    struct Node *left, *right;    int data;}; // Returns true if trees with root1 and root2// are level by level anagram, else returns false.bool areAnagrams(Node *root1, Node *root2){    // Base Cases    if (root1 == NULL && root2 == NULL)        return true;    if (root1 == NULL || root2 == NULL)        return false;     // start level order traversal of two trees    // using two queues.    queue<Node *> q1, q2;    q1.push(root1);    q2.push(root2);     while (1)    {        // n1 (queue size) indicates number of Nodes        // at current level in first tree and n2 indicates        // number of nodes in current level of second tree.        int n1 = q1.size(), n2 = q2.size();         // If n1 and n2 are different        if (n1 != n2)            return false;         // If level order traversal is over         if (n1 == 0)            break;         // Dequeue all Nodes of current level and        // Enqueue all Nodes of next level        vector<int> curr_level1, curr_level2;        while (n1 > 0)        {            Node *node1 = q1.front();            q1.pop();            if (node1->left != NULL)                q1.push(node1->left);            if (node1->right != NULL)                q1.push(node1->right);            n1--;             Node *node2 = q2.front();            q2.pop();            if (node2->left != NULL)                q2.push(node2->left);            if (node2->right != NULL)                q2.push(node2->right);             curr_level1.push_back(node1->data);            curr_level2.push_back(node2->data);        }         // Check if nodes of current levels are        // anagrams or not.        sort(curr_level1.begin(), curr_level1.end());        sort(curr_level2.begin(), curr_level2.end());        if (curr_level1 != curr_level2)            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(){    // Constructing both the trees.    struct Node* root1 = newNode(1);    root1->left = newNode(3);    root1->right = newNode(2);    root1->right->left = newNode(5);    root1->right->right = newNode(4);     struct Node* root2 = newNode(1);    root2->left = newNode(2);    root2->right = newNode(3);    root2->left->left = newNode(4);    root2->left->right = newNode(5);     areAnagrams(root1, root2)? cout << "Yes" : cout << "No";    return 0;}
/* Iterative program to check if two treesare level by level anagram. */import java.util.ArrayList;import java.util.Collections;import java.util.LinkedList;import java.util.Queue;  public class GFG{                                    // A Binary Tree Node    static class Node    {        Node left, right;        int data;        Node(int data){            this.data = data;            left = null;            right = null;        }    }          // Returns true if trees with root1 and root2    // are level by level anagram, else returns false.    static boolean areAnagrams(Node root1, Node root2)    {        // Base Cases        if (root1 == null && root2 == null)            return true;        if (root1 == null || root2 == null)            return false;              // start level order traversal of two trees        // using two queues.        Queue<Node> q1 = new LinkedList<Node>();        Queue<Node> q2 = new LinkedList<Node>();        q1.add(root1);        q2.add(root2);              while (true)        {            // n1 (queue size) indicates number of            // Nodes at current level in first tree            // and n2 indicates number of nodes in            // current level of second tree.            int n1 = q1.size(), n2 = q2.size();                  // If n1 and n2 are different            if (n1 != n2)                return false;                  // If level order traversal is over             if (n1 == 0)                break;                  // Dequeue all Nodes of current level and            // Enqueue all Nodes of next level            ArrayList<Integer> curr_level1 = new                                          ArrayList<>();            ArrayList<Integer> curr_level2 = new                                          ArrayList<>();            while (n1 > 0)            {                Node node1 = q1.peek();                q1.remove();                if (node1.left != null)                    q1.add(node1.left);                if (node1.right != null)                    q1.add(node1.right);                n1--;                      Node node2 = q2.peek();                q2.remove();                if (node2.left != null)                    q2.add(node2.left);                if (node2.right != null)                    q2.add(node2.right);                      curr_level1.add(node1.data);                curr_level2.add(node2.data);            }                  // Check if nodes of current levels are            // anagrams or not.            Collections.sort(curr_level1);            Collections.sort(curr_level2);                         if (!curr_level1.equals(curr_level2))                return false;        }              return true;    }         // Driver program to test above functions    public static void main(String args[])    {        // Constructing both the trees.        Node root1 = new Node(1);        root1.left = new Node(3);        root1.right = new Node(2);        root1.right.left = new Node(5);        root1.right.right = new Node(4);              Node root2 = new Node(1);        root2.left = new Node(2);        root2.right = new Node(3);        root2.left.left = new Node(4);        root2.left.right = new Node(5);                       System.out.println(areAnagrams(root1, root2)?                             "Yes" : "No");    }}// This code is contributed by Sumit Ghosh
# Iterative program to check if two# trees are level by level anagram # A Binary Tree Node# Utility function to create a# new tree Nodeclass newNode:    def __init__(self, data):        self.data = data        self.left = self.right = None         # Returns true if trees with root1# and root2 are level by level# anagram, else returns false.def areAnagrams(root1, root2) :     # Base Cases    if (root1 == None and root2 == None) :        return True    if (root1 == None or root2 == None) :        return False     # start level order traversal of    # two trees using two queues.    q1 = []    q2 = []    q1.append(root1)    q2.append(root2)     while (1) :             # n1 (queue size) indicates number        # of Nodes at current level in first        # tree and n2 indicates number of nodes        # in current level of second tree.        n1 = len(q1)        n2 = len(q2)         # If n1 and n2 are different        if (n1 != n2):            return False         # If level order traversal is over        if (n1 == 0):            break         # Dequeue all Nodes of current level        # and Enqueue all Nodes of next level        curr_level1 = []        curr_level2 = []        while (n1 > 0):            node1 = q1[0]            q1.pop(0)            if (node1.left != None) :                q1.append(node1.left)            if (node1.right != None) :                q1.append(node1.right)            n1 -= 1             node2 = q2[0]            q2.pop(0)            if (node2.left != None) :                q2.append(node2.left)            if (node2.right != None) :                q2.append(node2.right)             curr_level1.append(node1.data)            curr_level2.append(node2.data)                     # Check if nodes of current levels        # are anagrams or not.        curr_level1.sort()        curr_level2.sort()        if (curr_level1 != curr_level2) :            return False         return True # Driver Codeif __name__ == '__main__':         # Constructing both the trees.    root1 = newNode(1)    root1.left = newNode(3)    root1.right = newNode(2)    root1.right.left = newNode(5)    root1.right.right = newNode(4)     root2 = newNode(1)    root2.left = newNode(2)    root2.right = newNode(3)    root2.left.left = newNode(4)    root2.left.right = newNode(5)    if areAnagrams(root1, root2):        print("Yes")     else:        print("No") # This code is contributed# by SHUBHAMSINGH10
/* Iterative program to check if two treesare level by level anagram. */using System;using System.Collections.Generic; class GFG{                                // A Binary Tree Node    public class Node    {        public Node left, right;        public int data;        public Node(int data)        {            this.data = data;            left = null;            right = null;        }    }         // Returns true if trees with root1    // and root2 are level by level anagram,    // else returns false.    static Boolean areAnagrams(Node root1,                               Node root2)    {        // Base Cases        if (root1 == null && root2 == null)            return true;        if (root1 == null || root2 == null)            return false;             // start level order traversal of two trees        // using two queues.        Queue<Node> q1 = new Queue<Node>();        Queue<Node> q2 = new Queue<Node>();        q1.Enqueue(root1);        q2.Enqueue(root2);             while (true)        {            // n1 (queue size) indicates number of            // Nodes at current level in first tree            // and n2 indicates number of nodes in            // current level of second tree.            int n1 = q1.Count, n2 = q2.Count;                 // If n1 and n2 are different            if (n1 != n2)                return false;                 // If level order traversal is over            if (n1 == 0)                break;                 // Dequeue all Nodes of current level and            // Enqueue all Nodes of next level            List<int> curr_level1 = new List<int>();            List<int> curr_level2 = new List<int>();            while (n1 > 0)            {                Node node1 = q1.Peek();                q1.Dequeue();                if (node1.left != null)                    q1.Enqueue(node1.left);                if (node1.right != null)                    q1.Enqueue(node1.right);                n1--;                     Node node2 = q2.Peek();                q2.Dequeue();                if (node2.left != null)                    q2.Enqueue(node2.left);                if (node2.right != null)                    q2.Enqueue(node2.right);                     curr_level1.Add(node1.data);                curr_level2.Add(node2.data);            }                 // Check if nodes of current levels are            // anagrams or not.            curr_level1.Sort();            curr_level2.Sort();                         for(int i = 0;                    i < curr_level1.Count; i++)            if(curr_level1[i] != curr_level2[i])                return false;        }        return true;    }         // Driver Code    public static void Main(String []args)    {        // Constructing both the trees.        Node root1 = new Node(1);        root1.left = new Node(3);        root1.right = new Node(2);        root1.right.left = new Node(5);        root1.right.right = new Node(4);             Node root2 = new Node(1);        root2.left = new Node(2);        root2.right = new Node(3);        root2.left.left = new Node(4);        root2.left.right = new Node(5);                      Console.WriteLine(areAnagrams(root1,                                      root2) ?                                       "Yes" : "No");    }} // This code is contributed by Arnab Kundu
Output:  
Yes
Note: In the above program we are comparing the vectors storing each level of a tree directly using not equal to function ‘ != ‘ which compares the vectors first on the basis of their size and then on the basis of their content, hence saving our work of iteratively comparing the vectors. 
YouTubeGeeksforGeeks501K subscribersCheck if all levels of two trees are anagrams or not | GeeksforGeeksWatch laterShareCopy linkInfoShoppingTap to unmuteIf playback doesn't begin shortly, try restarting your device.You're signed outVideos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer.CancelConfirmMore videosMore videosSwitch cameraShareInclude playlistAn error occurred while retrieving sharing information. Please try again later.Watch on0:000:000:00 / 5:54•Live•<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=Z9J_dMFJyCw" 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 Aditya Gupta. 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. 
SHUBHAMSINGH10
andrew1234
geeknobita
anagram
tree-level-order
Queue
Tree
Queue
Tree
anagram
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Construct Complete Binary Tree from its Linked List Representation
FIFO (First-In-First-Out) approach in Programming
Applications of Priority Queue
Smallest multiple of a given number made of digits 0 and 9 only
Reversing a Queue
Tree Traversals (Inorder, Preorder and Postorder)
Binary Tree | Set 1 (Introduction)
AVL Tree | Set 1 (Insertion)
Inorder Tree Traversal without Recursion
Binary Tree | Set 3 (Types of Binary Tree)