import
java.util.*;
class
GFG{
static
int
N =
100000
;
@SuppressWarnings
(
"unchecked"
)
static
Vector<Integer> []v =
new
Vector[N];
static
HashMap<Integer,
Integer> mp =
new
HashMap<Integer,
Integer>();
static
Vector<Integer> a =
new
Vector<>();
static
void
dfs(
int
under[],
int
child,
int
parent)
{
a.add(child);
under[child] =
1
;
for
(
int
it : v[child])
{
if
(it != parent)
{
dfs(under, it, child);
under[child] += under[it];
}
}
}
static
void
printDFSofSubtree(
int
node,
int
under[])
{
int
ind = mp.get(node);
int
height = under[node];
System.out.print(
"The DFS of subtree "
+
node +
": "
);
for
(
int
i = ind; i < ind + under[node]; i++)
{
System.out.print(a.get(i) +
" "
);
}
System.out.println();
}
static
void
addEdge(
int
x,
int
y)
{
v[x].add(y);
v[y].add(x);
}
static
void
markIndexDfs()
{
int
size = a.size();
for
(
int
i =
0
; i < size; i++)
{
mp.put(a.get(i), i);
}
}
public
static
void
main(String[] args)
{
int
n =
7
;
for
(
int
i =
0
; i < v.length; i++)
v[i] =
new
Vector<Integer>();
addEdge(
1
,
2
);
addEdge(
1
,
3
);
addEdge(
2
,
4
);
addEdge(
2
,
5
);
addEdge(
4
,
6
);
addEdge(
4
,
7
);
int
[]under =
new
int
[n +
1
];
dfs(under,
1
,
0
);
markIndexDfs();
printDFSofSubtree(
2
, under);
printDFSofSubtree(
4
, under);
}
}