Check mirror in n-ary tree - GeeksforGeeks

07 Sep, 2021
Given two n-ary trees, the task is to check if they are the mirror of each other or not. Print “Yes” if they are the mirror of each other else “No”.
Examples: 
Input : Node = 3, Edges = 2
Edge 1 of first N-ary: 1 2
Edge 2 of first N-ary: 1 3
Edge 1 of second N-ary: 1 3
Edge 2 of second N-ary: 1 2
Output : Yes
Input : Node = 3, Edges = 2
Edge 1 of first N-ary: 1 2 
Edge 2 of first N-ary: 1 3
Edge 1 of second N-ary: 1 2
Edge 2 of second N-ary: 1 3
Output : No
Approach  1: (Using Hashing)
The idea is to use an unordered map of stacks to check if given N-ary tree are mirror of each other or not. Let the first n-ary tree be t1 and the second n-ary tree is t2. For each node in t1, push its connected node in their corresponding stack in the map. Now, for each node in t2, their connected node match with the top of the stack, then pop elements from the stack.  
Otherwise, if the node does not match with the top of the stack then it means two trees are not mirror of each other. Now, for each corresponding node do the following:  
  1. Iterate over map of stack
      Push all connected nodes of each node of first tree in map of  stack.

  2. Again iterate over map for each node of second tree
      For example :     

      Let us take one node X of second tree 
      
      For this node X , check in map which stack is used

      a = Top of that stack for node X present in second tree;
      b = Connected node of X in second tree
      if (a != b)
           return false;
      pop node X from stack.
C++
Java
Python3
C#
// C++ program to check if two n-ary trees are// mirror.#include <bits/stdc++.h>using namespace std; // Function to check given two trees are mirror// of each other or notint checkMirrorTree(int M, int N, int u1[ ],                    int v1[ ] , int u2[], int v2[])    {        // Map to store nodes of the tree        unordered_map<int , stack<int>>mp;           // Traverse first tree nodes        for (int i = 0 ; i < N ; i++ )        {           mp[u1[i]].push(v1[i]);        }                 // Traverse second tree nodes        for (int i = 0 ; i < N ; i++)        {            if(mp[u2[i]].top() != v2[i])                  return 0;            mp[u2[i]].pop();        }           return 1;    } // Driver codeint main(){    int M = 7, N = 6;         //Tree 1    int u1[] = { 1, 1, 1, 10, 10, 10 };    int v1[] = { 10, 7, 3, 4, 5, 6 };       //Tree 2    int u2[] = { 1, 1, 1, 10, 10, 10 };    int v2[] = { 3, 7, 10, 6, 5, 4 };     if(checkMirrorTree(M, N, u1, v1, u2, v2))       cout<<"Yes";    else       cout<<"No";       return 0;}
// Java program to check if two n-ary trees are mirror.import java.util.*;public class Main{    // Function to check given two trees are mirror    // of each other or not    static boolean checkMirrorTree(int M, int N, int[] u1, int[] v1, int[] u2, int[] v2)    {                // Map to store nodes of the tree        HashMap<Integer, Stack<Integer>> mp = new HashMap<>();             // Traverse first tree nodes        for (int i = 0 ; i < N ; i++ )        {           if(!mp.containsKey(u1[i]))           {               mp.put(u1[i], new Stack<Integer>());           }           else{               mp.get(u1[i]).push(v1[i]);           }        }                   // Traverse second tree nodes        for (int i = 0 ; i < N ; i++)        {            if(mp.containsKey(u2[i]) && mp.get(u2[i]).size() > 0)            {                if(mp.get(u2[i]).peek() != v2[i])                  return false;                mp.get(u2[i]).pop();            }        }             return true;    }       // Driver code    public static void main(String[] args) {        int M = 7, N = 6;               // Tree 1        int[] u1 = { 1, 1, 1, 10, 10, 10 };        int[] v1 = { 10, 7, 3, 4, 5, 6 };                 // Tree 2        int[] u2 = { 1, 1, 1, 10, 10, 10 };        int[] v2 = { 3, 7, 10, 6, 5, 4 };               if(checkMirrorTree(M, N, u1, v1, u2, v2))           System.out.print("Yes");        else           System.out.print("No");    }} // This code is contributed by divyeshrabadiya07.
# Python3 program to check if two n-ary trees are mirror. # Function to check given two trees are mirror# of each other or notdef checkMirrorTree(M, N, u1, v1, u2, v2):    # Map to store nodes of the tree    mp = {}     # Traverse first tree nodes    for i in range(N):        if u1[i] in mp:            mp[u1[i]].append(v1[i])        else:            mp[u1[i]] = []          # Traverse second tree nodes    for i in range(N):        if u2[i] in mp and len(mp[u2[i]]) > 0:            if(mp[u2[i]][-1] != v2[i]):                return 0            mp[u2[i]].pop()    return 1 M, N = 7, 6      #Tree 1u1 = [ 1, 1, 1, 10, 10, 10 ]v1 = [ 10, 7, 3, 4, 5, 6 ] #Tree 2u2 = [ 1, 1, 1, 10, 10, 10 ]v2 = [ 3, 7, 10, 6, 5, 4 ] if(checkMirrorTree(M, N, u1, v1, u2, v2)):   print("Yes")else:   print("No")         # This code is contributed by rameshtravel07.
// C# program to check if two n-ary trees are mirror.using System;using System.Collections.Generic;class GFG {         // Function to check given two trees are mirror    // of each other or not    static bool checkMirrorTree(int M, int N, int[] u1, int[] v1, int[] u2, int[] v2)    {               // Map to store nodes of the tree        Dictionary<int, Stack<int>> mp = new Dictionary<int, Stack<int>>();            // Traverse first tree nodes        for (int i = 0 ; i < N ; i++ )        {           if(!mp.ContainsKey(u1[i]))           {               mp[u1[i]] = new Stack<int>();           }           else{               mp[u1[i]].Push(v1[i]);           }        }                  // Traverse second tree nodes        for (int i = 0 ; i < N ; i++)        {            if(mp.ContainsKey(u2[i]) && mp[u2[i]].Count > 0)            {                if(mp[u2[i]].Peek() != v2[i])                  return false;                mp[u2[i]].Pop();            }        }            return true;    }       // Driver code  static void Main()  {    int M = 7, N = 6;          // Tree 1    int[] u1 = { 1, 1, 1, 10, 10, 10 };    int[] v1 = { 10, 7, 3, 4, 5, 6 };        // Tree 2    int[] u2 = { 1, 1, 1, 10, 10, 10 };    int[] v2 = { 3, 7, 10, 6, 5, 4 };      if(checkMirrorTree(M, N, u1, v1, u2, v2))       Console.Write("Yes");    else       Console.Write("No");  }} // This code is contributed by mukesh07.
Yes
Approach 2: (Using LinkedList):
The main approach is to use one list of stack and one list of queue to store to value of nodes given in the form of two arrays.
1. Initialize both the lists with empty stack and empty queues respectively.

2. Now, iterate over the lists
    Push all connected nodes of each node of first tree in list of stack and second tree list of queue.
    
3. Now iterate over the array and pop item from both stack and queue and check if they are same, if not same then return 0.
Java
Python3
C#
Javascript
// Java program to check two n-ary trees are mirror. import java.io.*;import java.util.*; class GFG {         // Function to check given two trees are mirror    // of each other or not      static int checkMirrorTree(int n, int e, int[] A, int[] B) {           //Lists to store nodes of the tree        List<Stack<Integer>> s = new ArrayList<>();        List<Queue<Integer>> q = new ArrayList<>();         // initializing both list with empty stack and queue        for (int i = 0; i <= n; i++) {            s.add(new Stack<>());            Queue<Integer> queue = new LinkedList<>();            q.add(queue);        }            // add all nodes of tree 1 to list of stack and tree 2 to list of queue        for (int i = 0; i < 2 * e; i += 2) {            s.get(A[i]).push(A[i + 1]);            q.get(B[i]).add(B[i + 1]);        }           // now take out the stack and queues        // for each of the nodes and compare them        // one by one        for (int i = 1; i <= n; i++) {            while (!s.get(i).isEmpty() && !q.get(i).isEmpty()) {                int a = s.get(i).pop();                int b = q.get(i).poll();                 if (a != b) {                    return 0;                }            }        }         return 1;    }       public static void main (String[] args) {        int n = 3;        int e = 2;        int A[] = { 1, 2, 1, 3 };        int B[] = { 1, 3, 1, 2 };         if (checkMirrorTree(n, e, A, B) == 1) {            System.out.println("Yes");        } else {            System.out.println("No");        }     }}
# Python3 program to check two n-ary trees are mirror. # Function to check given two trees are mirror# of each other or notdef checkMirrorTree(n, e, A, B):    # Lists to store nodes of the tree    s = []    q = []     # initializing both list with empty stack and queue    for i in range(n + 1):        s.append([])        queue = []        q.append(queue)    # add all nodes of tree 1 to   # list of stack and tree 2 to list of queue    for i in range(0, 2 * e, 2):        s[A[i]].append(A[i + 1])        q[B[i]].append(B[i + 1])     # now take out the stack and queues    # for each of the nodes and compare them    # one by one    for i in range(1, n + 1):        while (len(s[i]) > 0 and len(q[i]) > 0):            a = s[i][len(s[i]) - 1]            s[i].pop()            b = q[i][0]            q[i].pop(0)             if (a != b):                return 0    return 1   # Driver coden = 3e = 2A = [ 1, 2, 1, 3 ]B = [ 1, 3, 1, 2 ] if (checkMirrorTree(n, e, A, B) == 1):    print("Yes")else:    print("No")         # This code is contributed by decode2207.
// C# program to check two n-ary trees are mirror.using System;using System.Collections;using System.Collections.Generic;class GFG {         // Function to check given two trees are mirror    // of each other or not    static int checkMirrorTree(int n, int e, int[] A, int[] B)    {        //Lists to store nodes of the tree        List<Stack> s = new List<Stack>();        List<Queue> q = new List<Queue>();          // initializing both list with empty stack and queue        for (int i = 0; i <= n; i++) {            s.Add(new Stack());            Queue queue = new Queue();            q.Add(queue);        }             // add all nodes of tree 1 to list of stack and tree 2 to list of queue        for (int i = 0; i < 2 * e; i += 2) {            s[A[i]].Push(A[i + 1]);            q[B[i]].Enqueue(B[i + 1]);        }            // now take out the stack and queues        // for each of the nodes and compare them        // one by one        for (int i = 1; i <= n; i++) {            while (s[i].Count > 0 && q[i].Count > 0) {                int a = (int)s[i].Pop();                int b = (int)q[i].Dequeue();                  if (a != b) {                    return 0;                }            }        }          return 1;    }       static void Main() {    int n = 3;    int e = 2;    int[] A = { 1, 2, 1, 3 };    int[] B = { 1, 3, 1, 2 };     if (checkMirrorTree(n, e, A, B) == 1) {        Console.Write("Yes");    } else {        Console.Write("No");    }  }} // This code is contributed by divyesh072019.
<script>    // Javascript program to check two n-ary trees are mirror.         // Function to check given two trees are mirror    // of each other or not      function checkMirrorTree(n, e, A, B) {            //Lists to store nodes of the tree        let s = [];        let q = [];          // initializing both list with empty stack and queue        for (let i = 0; i <= n; i++) {            s.push([]);            let queue = [];            q.push(queue);        }             // add all nodes of tree 1 to           // list of stack and tree 2 to list of queue        for (let i = 0; i < 2 * e; i += 2) {            s[A[i]].push(A[i + 1]);            q[B[i]].push(B[i + 1]);        }            // now take out the stack and queues        // for each of the nodes and compare them        // one by one        for (let i = 1; i <= n; i++) {            while (s[i].length > 0 && q[i].length > 0) {                let a = s[i][s[i].length - 1];                s[i].pop();                let b = q[i][0];                q[i].shift();                  if (a != b) {                    return 0;                }            }        }          return 1;    }         let n = 3;    let e = 2;    let A = [ 1, 2, 1, 3 ];    let B = [ 1, 3, 1, 2 ];     if (checkMirrorTree(n, e, A, B) == 1) {      document.write("Yes");    } else {      document.write("No");    }       // This code is contributed by suresh07.</script>
Yes
Reference: https://practice.geeksforgeeks.org/problems/check-mirror-in-n-ary-tree/0This article is contributed by Nitin Kumar. 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. 
cs_abhi
rutvik_56
tridib_samanta
GauravRajput1
nitinkumarco19
dwightschrute05
suresh07
rameshtravel07
mukesh07
divyeshrabadiya07
divyesh072019
decode2207
Amazon
MakeMyTrip
n-ary-tree
STL
Queue
Stack
Tree
Amazon
MakeMyTrip
Stack
Queue
Tree
STL
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Queue | Set 1 (Introduction and Array Implementation)
Priority Queue | Set 1 (Introduction)
LRU Cache Implementation
Queue - Linked List Implementation
Circular Queue | Set 1 (Introduction and Array Implementation)
Stack Data Structure (Introduction and Program)
Stack Class in Java
Stack in Python
Check for Balanced Brackets in an expression (well-formedness) using Stack
Program for Tower of Hanoi