#include <bits/stdc++.h>
using
namespace
std;
struct
Node {
int
data;
struct
Node* left;
struct
Node* right;
};
struct
Node* newNode(
int
data)
{
struct
Node* node =
new
(
struct
Node);
node->data = data;
node->left = node->right = NULL;
return
(node);
}
int
minPathSumUtil(
struct
Node* root,
int
& result)
{
if
(root == NULL)
return
0;
if
(root->left == NULL && root->right == NULL)
return
root->data;
int
ls = minPathSumUtil(root->left, result);
int
rs = minPathSumUtil(root->right, result);
if
(root->left && root->right) {
result = min(result, ls + rs + root->data);
return
min(ls + root->data, rs + root->data);
}
if
(root->left == NULL)
return
rs + root->data;
else
return
ls + root->data;
}
int
minPathSum(
struct
Node* root)
{
int
result = INT_MAX;
minPathSumUtil(root, result);
return
result;
}
int
main()
{
struct
Node* root = newNode(4);
root->left = newNode(5);
root->right = newNode(-6);
root->left->left = newNode(2);
root->left->right = newNode(-3);
root->right->left = newNode(1);
root->right->right = newNode(8);
cout << minPathSum(root);
return
0;
}