using
System;
using
System.Collections;
using
System.Collections.Generic;
class
GFG{
class
Node
{
public
int
data;
public
Node left, right;
public
Node(
int
data)
{
this
.data = data;
this
.left =
this
.right =
null
;
}
};
static
bool
isIsomorphic(Node root1,
Node root2)
{
if
(root1 ==
null
&&
root2 ==
null
)
return
true
;
else
if
(root1 ==
null
||
root2 ==
null
)
return
false
;
Queue q1 =
new
Queue();
Queue q2 =
new
Queue();
q1.Enqueue(root1);
q2.Enqueue(root2);
int
level = 0;
int
size;
ArrayList v2 =
new
ArrayList();
Dictionary<
int
,
int
> mp =
new
Dictionary<
int
,
int
>();
while
(q1.Count != 0 && q2.Count != 0)
{
if
(q1.Count != q2.Count)
return
false
;
size = q1.Count;
level++;
v2.Clear();
mp.Clear();
while
(size-- > 0)
{
Node temp1 = (Node)q1.Dequeue();
Node temp2 = (Node)q2.Dequeue();
if
(!mp.ContainsKey(temp1.data))
mp[temp1.data] = 1;
else
mp[temp1.data]++;
v2.Add(temp2.data);
if
(temp1.left !=
null
)
q1.Enqueue(temp1.left);
if
(temp1.right !=
null
)
q1.Enqueue(temp1.right);
if
(temp2.left !=
null
)
q2.Enqueue(temp2.left);
if
(temp2.right !=
null
)
q2.Enqueue(temp2.right);
}
foreach
(
int
i
in
v2)
{
if
(!mp.ContainsKey(i))
return
false
;
else
{
mp[i]--;
if
(mp[i] < 0)
return
false
;
else
if
(mp[i] == 0)
mp.Remove(i);
}
}
if
(mp.Count != 0)
return
false
;
}
return
true
;
}
public
static
void
Main(
string
[] args)
{
Node n1 =
new
Node(1);
n1.left =
new
Node(2);
n1.right =
new
Node(3);
n1.left.left =
new
Node(4);
n1.left.right =
new
Node(5);
n1.right.left =
new
Node(6);
n1.left.right.left =
new
Node(7);
n1.left.right.right =
new
Node(8);
Node n2 =
new
Node(1);
n2.left =
new
Node(3);
n2.right =
new
Node(2);
n2.right.left =
new
Node(4);
n2.right.right =
new
Node(5);
n2.left.right =
new
Node(6);
n2.right.right.left =
new
Node(8);
n2.right.right.right =
new
Node(7);
if
(isIsomorphic(n1, n2))
Console.WriteLine(
"Yes"
);
else
Console.WriteLine(
"No"
);
}
}