import
java.io.*;
import
java.util.*;
class
Node {
int
data;
Node left, right;
Node(
int
d)
{
data = d;
left = right =
null
;
}
}
class
GFG {
static
Node newNode(
int
d)
{
Node temp =
new
Node(d);
temp.left =
null
;
temp.right =
null
;
return
temp;
}
static
Node
createBinaryTree(List<List<Integer> > descriptions)
{
Map<Integer, Node> mp =
new
HashMap<>();
for
(List<Integer> it : descriptions) {
Node parentNode, childNode;
if
(mp.containsKey(it.get(
0
))) {
parentNode = mp.get(it.get(
0
));
}
else
{
parentNode = newNode(it.get(
0
));
mp.put(it.get(
0
), parentNode);
}
if
(mp.containsKey(it.get(
1
))) {
childNode = mp.get(it.get(
1
));
}
else
{
childNode = newNode(it.get(
1
));
mp.put(it.get(
1
), childNode);
}
if
(it.get(
2
) ==
1
) {
parentNode.left = childNode;
}
else
{
parentNode.right = childNode;
}
}
Map<Integer, Integer> storeChild =
new
HashMap<>();
for
(List<Integer> it : descriptions) {
storeChild.put(it.get(
1
),
1
);
}
Node root =
null
;
for
(List<Integer> it : descriptions) {
if
(!storeChild.containsKey(it.get(
0
))) {
root = mp.get(it.get(
0
));
}
}
return
root;
}
static
void
printLevelOrder(Node root)
{
if
(root ==
null
) {
return
;
}
Queue<Node> q =
new
LinkedList<>();
q.add(root);
while
(!q.isEmpty()) {
Node node = q.peek();
System.out.print(node.data +
" "
);
q.poll();
if
(node.left !=
null
) {
q.add(node.left);
}
if
(node.right !=
null
) {
q.add(node.right);
}
}
}
public
static
void
main(String[] args)
{
List<List<Integer> > RelationArray
= Arrays.asList(Arrays.asList(
20
,
15
,
1
),
Arrays.asList(
20
,
17
,
0
),
Arrays.asList(
50
,
20
,
1
),
Arrays.asList(
50
,
80
,
0
),
Arrays.asList(
80
,
19
,
1
));
Node root = createBinaryTree(RelationArray);
printLevelOrder(root);
System.out.println();
List<List<Integer> > RelationArray2 = Arrays.asList(
Arrays.asList(
1
,
2
,
1
), Arrays.asList(
2
,
3
,
0
),
Arrays.asList(
3
,
4
,
1
));
Node root2 = createBinaryTree(RelationArray2);
printLevelOrder(root2);
}
}