using
System;
using
System.Collections.Generic;
class
Node
{
public
int
val;
public
Node left, right;
public
Node(
int
val)
{
this
.val = val;
this
.left =
this
.right =
null
;
}
}
public
class
GFG
{
static
int
FindMaxSum(Node root)
{
int
max_sum =
int
.MinValue;
Stack<Tuple<Node,
int
>> stack =
new
Stack<Tuple<Node,
int
>>();
stack.Push(
new
Tuple<Node,
int
>(root, 0));
while
(stack.Count > 0)
{
Tuple<Node,
int
> pair = stack.Pop();
Node node = pair.Item1;
int
state = pair.Item2;
if
(node ==
null
)
{
continue
;
}
if
(state == 0)
{
stack.Push(
new
Tuple<Node,
int
>(node, 1));
stack.Push(
new
Tuple<Node,
int
>(node.left, 0));
}
else
if
(state == 1)
{
stack.Push(
new
Tuple<Node,
int
>(node, 2));
stack.Push(
new
Tuple<Node,
int
>(node.right, 0));
}
else
{
int
left_sum = (node.left !=
null
) ? node.left.val : 0;
int
right_sum = (node.right !=
null
) ? node.right.val : 0;
max_sum = Math.Max(max_sum, node.val + Math.Max(0, left_sum) + Math.Max(0, right_sum));
int
max_child_sum = Math.Max(left_sum, right_sum);
node.val += Math.Max(0, max_child_sum);
}
}
return
max_sum;
}
public
static
void
Main(
string
[] args)
{
Node root =
new
Node(10);
root.left =
new
Node(2);
root.right =
new
Node(-25);
root.left.left =
new
Node(20);
root.left.right =
new
Node(1);
root.right.left =
new
Node(3);
root.right.right =
new
Node(4);
int
max_sum = FindMaxSum(root);
Console.WriteLine(
"Maximum Path Sum: "
+ max_sum);
}
}