import
java.util.*;
class
Node {
int
data;
int
hd;
Node left, right;
public
Node(
int
key) {
data = key;
left = right =
null
;
}
}
public
class
BottomViewSum {
static
Node newNode(
int
key) {
return
new
Node(key);
}
static
int
sumOfBottomView(Node root) {
Map<Integer, Pair<Integer, Integer>> map =
new
TreeMap<>();
sumOfBottomViewUtil(root,
0
,
0
, map);
int
sum =
0
;
for
(Map.Entry<Integer, Pair<Integer, Integer>> entry : map.entrySet()) {
Pair<Integer, Integer> p = entry.getValue();
sum += p.getKey();
}
return
sum;
}
static
void
sumOfBottomViewUtil(Node root,
int
curr,
int
hd,
Map<Integer, Pair<Integer, Integer>> map) {
if
(root ==
null
)
return
;
if
(!map.containsKey(hd))
map.put(hd,
new
Pair<>(root.data, curr));
else
{
Pair<Integer, Integer> p = map.get(hd);
if
(p.getValue() <= curr) {
p.setValue(curr);
p.setKey(root.data);
}
}
sumOfBottomViewUtil(root.left, curr +
1
, hd -
1
, map);
sumOfBottomViewUtil(root.right, curr +
1
, hd +
1
, map);
}
public
static
void
main(String[] args) {
Node root = newNode(
20
);
root.left = newNode(
8
);
root.right = newNode(
22
);
root.left.left = newNode(
5
);
root.left.right = newNode(
3
);
root.right.left = newNode(
4
);
root.right.right = newNode(
25
);
root.left.right.left = newNode(
10
);
root.left.right.right = newNode(
14
);
System.out.println(sumOfBottomView(root));
}
}
class
Pair<T, U> {
private
T first;
private
U second;
public
Pair(T first, U second) {
this
.first = first;
this
.second = second;
}
public
T getKey() {
return
first;
}
public
void
setKey(T first) {
this
.first = first;
}
public
U getValue() {
return
second;
}
public
void
setValue(U second) {
this
.second = second;
}
}