import
java.util.*;
class
Node {
Node left, right;
int
data;
Node(
int
data) {
this
.data = data;
left = right =
null
;
}
}
public
class
Main {
static
void
EachLevel(Node root, HashMap<Integer, ArrayList<Integer>> mm,
int
level) {
if
(root ==
null
)
return
;
if
(!mm.containsKey(level)) {
mm.put(level,
new
ArrayList<>());
}
mm.get(level).add(root.data);
level++;
EachLevel(root.left, mm, level);
EachLevel(root.right, mm, level);
}
static
boolean
areAnagrams(HashMap<Integer, ArrayList<Integer>> mm1, HashMap<Integer, ArrayList<Integer>> mm2) {
HashMap<Integer, Integer> temp =
new
HashMap<>();
for
(Map.Entry<Integer, ArrayList<Integer>> entry : mm1.entrySet()) {
for
(
int
y : entry.getValue()) {
temp.put(y, temp.getOrDefault(y,
0
) +
1
);
}
for
(
int
y : mm2.get(entry.getKey())) {
if
(temp.getOrDefault(y,
0
) ==
0
)
return
false
;
temp.put(y, temp.get(y) -
1
);
}
}
temp.clear();
for
(Map.Entry<Integer, ArrayList<Integer>> entry : mm2.entrySet()) {
for
(
int
y : entry.getValue()) {
temp.put(y, temp.getOrDefault(y,
0
) +
1
);
}
for
(
int
y : mm1.get(entry.getKey())) {
if
(temp.getOrDefault(y,
0
) ==
0
)
return
false
;
temp.put(y, temp.get(y) -
1
);
}
}
return
true
;
}
static
Node newNode(
int
data) {
return
new
Node(data);
}
public
static
void
main(String[] args) {
Node root1 = newNode(
1
);
root1.left = newNode(
3
);
root1.right = newNode(
2
);
root1.right.left = newNode(
5
);
root1.right.right = newNode(
4
);
Node root2 = newNode(
1
);
root2.left = newNode(
2
);
root2.right = newNode(
3
);
root2.left.left = newNode(
4
);
root2.left.right = newNode(
5
);
HashMap<Integer, ArrayList<Integer>> mm1 =
new
HashMap<>();
HashMap<Integer, ArrayList<Integer>> mm2 =
new
HashMap<>();
EachLevel(root1, mm1,
0
);
EachLevel(root2, mm2,
0
);
if
(areAnagrams(mm1, mm2))
System.out.println(
"Yes"
);
else
System.out.println(
"No"
);
}
}