import
java.util.ArrayList;
import
java.util.Arrays;
import
java.util.HashMap;
import
java.util.LinkedList;
import
java.util.Queue;
import
java.util.TreeMap;
public
class
GFG {
static
void
printVector(ArrayList<Integer> v)
{
for
(
int
i =
0
; i < v.size(); i++) {
System.out.print(v.get(i) +
" "
);
}
}
static
class
TreeNode {
int
val;
TreeNode left, right;
TreeNode(
int
data)
{
val = data;
left =
null
;
right =
null
;
}
}
static
void
insert(TreeNode root,
int
val)
{
Queue<TreeNode> q =
new
LinkedList<TreeNode>();
q.add(root);
while
(q.isEmpty() ==
false
) {
TreeNode temp = q.peek();
q.poll();
if
(temp.left ==
null
) {
temp.left =
new
TreeNode(val);
return
;
}
else
{
q.add(temp.left);
}
if
(temp.right ==
null
) {
temp.right =
new
TreeNode(val);
return
;
}
else
{
q.add(temp.right);
}
}
}
static
TreeNode buildTree(ArrayList<Integer> v)
{
TreeNode root =
new
TreeNode(v.get(
0
));
for
(
int
i =
1
; i < v.size(); i++) {
insert(root, v.get(i));
}
return
root;
}
static
int
findsubTreeSumUtil(
TreeNode node,
TreeMap<Integer, ArrayList<Integer> > mpp,
HashMap<Integer, Integer> frequency)
{
if
(node ==
null
)
return
0
;
int
left
= findsubTreeSumUtil(node.left, mpp, frequency);
int
right = findsubTreeSumUtil(node.right, mpp,
frequency);
int
totalSum = node.val + left + right;
if
(frequency.get(totalSum) ==
null
) {
ArrayList<Integer> temp = mpp.get(
1
);
if
(temp ==
null
)
temp =
new
ArrayList<Integer>();
temp.add(totalSum);
mpp.put(
1
, temp);
frequency.put(totalSum,
1
);
}
else
{
frequency.put(totalSum,
frequency.get(totalSum) +
1
);
ArrayList<Integer> temp
= mpp.get(frequency.get(totalSum));
if
(temp ==
null
)
temp =
new
ArrayList<Integer>();
temp.add(totalSum);
mpp.put(frequency.get(totalSum), temp);
}
return
totalSum;
}
static
void
findsubTreeSum(TreeNode root)
{
TreeMap<Integer, ArrayList<Integer> > mpp
=
new
TreeMap<Integer, ArrayList<Integer> >();
HashMap<Integer, Integer> frequency
=
new
HashMap<Integer, Integer>();
if
(root ==
null
) {
return
;
}
findsubTreeSumUtil(root, mpp, frequency);
printVector(mpp.lastEntry().getValue());
}
public
static
void
main(String args[])
{
ArrayList<Integer> v =
new
ArrayList<Integer>();
v.addAll(Arrays.asList(
5
,
2
, -
4
));
TreeNode tree = buildTree(v);
findsubTreeSum(tree);
}
}