If a binary tree is given, how to find Maximum path sum between two leaves of binary tree.
All should be numbers The maximum sum path may or may not go through root. For example, in the following binary tree, the maximum sum is 27(3 + 6 + 9 + 0 – 1 + 10). Expected time complexity is O(n). Algorithm : 1) We need sum for left and right binary sub tree. |
to understand logic see how Sum for every node
for node = -8 Sum is = 0 , ls = 2 rs = 6 for node = 5 Sum is = 4 , ls = -2 rs = 1 for leaf = -1 Sum is = 4 for node = 0 Sum is = 13 , ls = 4 rs = 9 for leaf = 9 Sum is = 13 for node = 6 Sum is = 27 , ls = 3 rs = 18 for node = -15 Sum is = 27 , ls = 6 rs = 24 Max pathSum of the given binary tree is 27
So Now we can understand that.
1) Recursive call to left and right subtree.
2) to hold current sum.
currentSum = leftSum + rightSum + root->value;
3) To store result we need to pass it with reference, so that in each recursion it stays constant.
4) return Maximum(leftSum, rightSum) + root->value.
int maxPathSumUtil(struct Node *root, int &result) { if (root==NULL) return 0; //Step1 int lLPSum = maxPathSumUtil(root->left, result); int rLPSum = maxPathSumUtil(root->right, result); //Step2 int curr_sum = lLPSum + rLPSum + root->data; //Step3 if (result < curr_sum) result = curr_sum; //Step4 return max(lLPSum, rLPSum)+root->data; } int maxPathSum(struct Node *root) { int res = 0; maxPathSumUtil(root, result); cout<< result; }
Understand how to code in C++
// C++ program to find maximum path sum between two leaves of Bin Tree by Gohired.in #include <iostream> #include <climits> using namespace std; struct Node { int data; struct Node* left, *right; }; struct Node* newNode(int data) { struct Node* node = new(struct Node); node->data = data; node->left = node->right = NULL; return (node); } int max(int a, int b) { return (a >= b)? a: b; } int maxPathSumUtil(struct Node *root, int &res) { if (root==NULL) return 0; if (!root->left && !root->right) return root->data; int ls = maxPathSumUtil(root->left, res); int rs = maxPathSumUtil(root->right, res); if (root->left && root->right) { res = max(res, ls + rs + root->data); int temp = max(ls, rs) + root->data; cout << "for node = " <<root->data << " Sum is = " <<temp <<" ls = "<< ls <<" rs = " << rs <<endl; return temp; } int temp = (!root->left)? rs + root->data:ls + root->data; cout << "for leaf = " <<root->data << " Sum is = "<< temp <<endl; return temp; } int main() { int res = INT_MIN; struct Node *root = newNode(-10); root->left = newNode(25); root->right = newNode(6); root->left->left = newNode(-8); root->left->right = newNode(1); root->left->left->left = newNode(2); root->left->left->right = newNode(6); root->right->left = newNode(3); root->right->right = newNode(9); root->right->right->right= newNode(0); root->right->right->right->left= newNode(4); //root->right->right->right->right= newNode(-1); //root->right->right->right->right->left= newNode(10); maxPathSumUtil(root,res); cout << "Max pathSum of the given binary tree is " <<res; return 0; }
Anonymous says
May 25, 2015 at 6:32 pmThe think is right,but the code has some mistakes.
You can log in leetcode(https://leetcode.com/problems/binary-tree-maximum-path-sum/) to test your code.
Best wishes!
Hengameh says
September 20, 2015 at 8:30 amIn 4th step:
4) return Maximum(leftSum, rightSum) + root->value.
what if this one was the max:
leftSum + rightSum + root->value.