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.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int checkMirrorTree( int M, int N, int u1[ ],
int v1[ ] , int u2[], int v2[])
{
unordered_map< int , stack< int >>mp;
for ( int i = 0 ; i < N ; i++ )
{
mp[u1[i]].push(v1[i]);
}
for ( int i = 0 ; i < N ; i++)
{
if (mp[u2[i]].top() != v2[i])
return 0;
mp[u2[i]].pop();
}
return 1;
}
int main()
{
int M = 7, N = 6;
int u1[] = { 1, 1, 1, 10, 10, 10 };
int v1[] = { 10, 7, 3, 4, 5, 6 };
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
import java.util.*;
public class Main
{
static boolean checkMirrorTree( int M, int N, int [] u1, int [] v1, int [] u2, int [] v2)
{
HashMap<Integer, Stack<Integer>> mp = new HashMap<>();
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]);
}
}
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 ;
}
public static void main(String[] args) {
int M = 7 , N = 6 ;
int [] u1 = { 1 , 1 , 1 , 10 , 10 , 10 };
int [] v1 = { 10 , 7 , 3 , 4 , 5 , 6 };
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" );
}
}
|
Python3
def checkMirrorTree(M, N, u1, v1, u2, v2):
mp = {}
for i in range (N):
if u1[i] in mp:
mp[u1[i]].append(v1[i])
else :
mp[u1[i]] = []
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
u1 = [ 1 , 1 , 1 , 10 , 10 , 10 ]
v1 = [ 10 , 7 , 3 , 4 , 5 , 6 ]
u2 = [ 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" )
|
C#
using System;
using System.Collections.Generic;
class GFG {
static bool checkMirrorTree( int M, int N, int [] u1, int [] v1, int [] u2, int [] v2)
{
Dictionary< int , Stack< int >> mp = new Dictionary< int , Stack< int >>();
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]);
}
}
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 ;
}
static void Main()
{
int M = 7, N = 6;
int [] u1 = { 1, 1, 1, 10, 10, 10 };
int [] v1 = { 10, 7, 3, 4, 5, 6 };
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" );
}
}
|
Javascript
function checkMirrorTree(M, N, u1, v1, u2, v2) {
let mp = {}
for (let i = 0; i < N; i++) {
if (u1[i] in mp) {
mp[u1[i]].push(v1[i]);
} else {
mp[u1[i]] = [v1[i]];
}
}
for (let i = 0; i < N; i++) {
if (u2[i] in mp && mp[u2[i]].length > 0) {
if (mp[u2[i]][mp[u2[i]].length - 1] != v2[i]) {
return 0;
}
mp[u2[i]].pop();
}
}
return 1;
}
let M = 7,
N = 6;
let u1 = [1, 1, 1, 10, 10, 10];
let v1 = [10, 7, 3, 4, 5, 6];
let u2 = [1, 1, 1, 10, 10, 10];
let v2 = [3, 7, 10, 6, 5, 4];
if (checkMirrorTree(M, N, u1, v1, u2, v2)) {
console.log( "Yes" );
} else {
console.log( "No" );
}
|
Time Complexity: O(N).
Auxiliary Space: O(N).
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.
- Initialize both the lists with empty stack and empty queues respectively.
- 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.
- 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.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int checkMirrorTree( int n, int e, int A[], int B[])
{
vector<stack< int >> s;
vector<queue< int >> q;
for ( int i = 0; i <= n; i++)
{
s.push_back(stack< int >());
queue< int > queue;
q.push_back(queue);
}
for ( int i = 0; i < 2 * e; i += 2)
{
s[A[i]].push(A[i + 1]);
q[B[i]].push(B[i + 1]);
}
for ( int i = 1; i <= n; i++)
{
while (!s[i].empty() && !q[i].empty())
{
int a = s[i].top();
s[i].pop();
int b = q[i].front();
q[i].pop();
if (a != b)
{
return 0;
}
}
}
return 1;
}
int 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)
{
cout << "Yes" ;
}
else
{
cout << "No" ;
}
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
static int checkMirrorTree( int n, int e, int [] A, int [] B) {
List<Stack<Integer>> s = new ArrayList<>();
List<Queue<Integer>> q = new ArrayList<>();
for ( int i = 0 ; i <= n; i++) {
s.add( new Stack<>());
Queue<Integer> queue = new LinkedList<>();
q.add(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 ]);
}
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
def checkMirrorTree(n, e, A, B):
s = []
q = []
for i in range (n + 1 ):
s.append([])
queue = []
q.append(queue)
for i in range ( 0 , 2 * e, 2 ):
s[A[i]].append(A[i + 1 ])
q[B[i]].append(B[i + 1 ])
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
n = 3
e = 2
A = [ 1 , 2 , 1 , 3 ]
B = [ 1 , 3 , 1 , 2 ]
if (checkMirrorTree(n, e, A, B) = = 1 ):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
using System.Collections;
using System.Collections.Generic;
class GFG {
static int checkMirrorTree( int n, int e, int [] A, int [] B)
{
List<Stack> s = new List<Stack>();
List<Queue> q = new List<Queue>();
for ( int i = 0; i <= n; i++) {
s.Add( new Stack());
Queue queue = new Queue();
q.Add(queue);
}
for ( int i = 0; i < 2 * e; i += 2) {
s[A[i]].Push(A[i + 1]);
q[B[i]].Enqueue(B[i + 1]);
}
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" );
}
}
}
|
Javascript
<script>
function checkMirrorTree(n, e, A, B) {
let s = [];
let q = [];
for (let i = 0; i <= n; i++) {
s.push([]);
let queue = [];
q.push(queue);
}
for (let i = 0; i < 2 * e; i += 2) {
s[A[i]].push(A[i + 1]);
q[B[i]].push(B[i + 1]);
}
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" );
}
</script>
|
Time complexity: O(N) where N is no of nodes in given n-ary tree
Auxiliary space: O(N)
Reference: https://www.geeksforgeeks.org/problems/check-mirror-in-n-ary-tree/0
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.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
16 Jan, 2023
Like Article
Save Article