首页 > 代码库 > Binary Tree Maximum Path Sum

Binary Tree Maximum Path Sum

Given a binary tree, find the maximum path sum.

The path may start and end at any node in the tree.

For example:

Given the below binary tree,

       1      /      2   3

Return 6.

思路:题目要求求解最大的路径和:我们先只考虑以node为根的子树,显然必定包含node的最大和路径为;{ node }、{ subPath(node->left), node }、{ node, subPath(node->right) }、{ subPath(node->left), node, subPath(node->right) }四个中值最大的那条路径。因此,我们只需求出subPath(node->left)和subPath(node->right),即可确定必定包含node的最大和路径。显然,问题的规模变小了。

        我们再来考虑node的父节点。显然,为了确定必定包含node父节点的最大和路径,subPath(node)应返回:{ node }、{ subPath(node->left), node }、{ node, subPath(node->right) }三个中值最大的那条路径的值。

        该问题本质上是二叉树的后序遍历。我们使用递归可以获得非常优雅的解法。同时我们需要使用一个全局变量存储找到的最大路径和。

 1 class Solution { 2 public: 3     int maxPathSum( TreeNode *root ) { 4         if( !root ) { return 0; } 5         maxSum = root->val; 6         maxPathSumSub( root ); 7         return maxSum; 8     } 9 private:10     int maxPathSumSub( TreeNode *node ) {11         int left = 0, right = 0;12         if( node->left ) { left = maxPathSumSub( node->left ); }13         if( node->right ) { right = maxPathSumSub( node->right ); }14         int curMax = node->val + max( 0, left ) + max( 0, right );15         if( maxSum < curMax ) { maxSum = curMax; }16         return node->val + max( 0, max( left, right ) );17     }18     int maxSum;19 };