using
System;
using
System.Collections.Generic;
class
Node {
public
int
data;
public
Node left, right;
public
Node(
int
item)
{
data = item;
left = right =
null
;
}
}
public
class
GFG {
static
int
maxVerticalSum(Node root)
{
if
(root ==
null
) {
return
0;
}
Dictionary<
int
,
int
> verSum
=
new
Dictionary<
int
,
int
>();
int
maxSum =
int
.MinValue;
int
currLev;
Queue<KeyValuePair<Node,
int
> > q
=
new
Queue<KeyValuePair<Node,
int
> >();
q.Enqueue(
new
KeyValuePair<Node,
int
>(root, 0));
while
(q.Count > 0)
{
KeyValuePair<Node,
int
> front = q.Dequeue();
root = front.Key;
currLev = front.Value;
if
(verSum.ContainsKey(currLev)) {
verSum[currLev] += root.data;
}
else
{
verSum[currLev] = root.data;
}
if
(root.left !=
null
) {
q.Enqueue(
new
KeyValuePair<Node,
int
>(
root.left, currLev - 1));
}
if
(root.right !=
null
) {
q.Enqueue(
new
KeyValuePair<Node,
int
>(
root.right, currLev + 1));
}
}
foreach
(
int
levelSum
in
verSum.Values)
{
maxSum = Math.Max(maxSum, levelSum);
}
return
maxSum;
}
static
public
void
Main()
{
Node root =
new
Node(3);
root.left =
new
Node(4);
root.right =
new
Node(6);
root.left.left =
new
Node(-1);
root.left.right =
new
Node(-2);
root.right.left =
new
Node(5);
root.right.right =
new
Node(10);
root.right.left.right =
new
Node(8);
Console.WriteLine(maxVerticalSum(root));
}
}