using
System;
public
class
Node {
public
int
data;
public
Node left, right;
public
Node(
int
item)
{
data = item;
left = right =
null
;
}
}
public
class
Maximum {
public
int
max_no =
int
.MinValue;
}
public
class
BinaryTree {
public
Node root;
public
Maximum max =
new
Maximum();
public
Node target_leaf =
null
;
public
virtual
bool
printPath(Node node, Node target_leaf)
{
if
(node ==
null
) {
return
false
;
}
if
(node == target_leaf || printPath(node.left, target_leaf)
|| printPath(node.right, target_leaf)) {
Console.Write(node.data +
" "
);
return
true
;
}
return
false
;
}
public
virtual
void
getTargetLeaf(Node node, Maximum max_sum_ref,
int
curr_sum)
{
if
(node ==
null
) {
return
;
}
curr_sum = curr_sum + node.data;
if
(node.left ==
null
&& node.right ==
null
) {
if
(curr_sum > max_sum_ref.max_no) {
max_sum_ref.max_no = curr_sum;
target_leaf = node;
}
}
getTargetLeaf(node.left, max_sum_ref, curr_sum);
getTargetLeaf(node.right, max_sum_ref, curr_sum);
}
public
virtual
int
maxSumPath()
{
if
(root ==
null
) {
return
0;
}
getTargetLeaf(root, max, 0);
printPath(root, target_leaf);
return
max.max_no;
}
public
static
void
Main(
string
[] args)
{
BinaryTree tree =
new
BinaryTree();
tree.root =
new
Node(10);
tree.root.left =
new
Node(-2);
tree.root.right =
new
Node(7);
tree.root.left.left =
new
Node(8);
tree.root.left.right =
new
Node(-4);
Console.WriteLine(
"Following are the nodes "
+
"on maximum sum path"
);
int
sum = tree.maxSumPath();
Console.WriteLine(
""
);
Console.WriteLine(
"Sum of nodes is : "
+ sum);
}
}