【Binary Tree Maximum Path Sum】cpp
生活随笔
收集整理的這篇文章主要介紹了
【Binary Tree Maximum Path Sum】cpp
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
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,
?
Return?6.
代碼:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:int maxPathSum(TreeNode* root){int max_sum = INT_MIN;Solution::dfs4MaxSum(root, max_sum);return max_sum;}static int dfs4MaxSum(TreeNode* root, int& max_sum){int ret=0;if ( !root ) return ret;int l = Solution::dfs4MaxSum(root->left, max_sum);int r = Solution::dfs4MaxSum(root->right, max_sum);if ( l>0 ) ret += l;if ( r>0 ) ret += r;ret += root->val;max_sum = std::max(ret, max_sum);return std::max(root->val, std::max(root->val+l, root->val+r));} };tips:
求array最大子序列和是一樣的思路。只不過binary tree不是一路,而是分左右兩路,自底向上算。
主要注意的地方如下:
1. 維護一個全局最優變量(max_sum),再用ret存放包括前節點在內的局部最大值;每次比較max_sum和ret時,max_sum代表的是不包含當前節點在內的全局最優,ret代表的是一定包含當前節點在內的全局最優。
2. dfs4MaxSum返回時需要注意,left和right只能算一路,不能一起都返到上一層。因為題目中要求的path抻直了只能是一條線,不能帶分叉的。
==============================================
第二次過這道題,大體思路有了,細節的錯誤也都犯了,改過來強化一次AC了。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:int maxPathSum(TreeNode* root){int ret = INT_MIN;if (root) Solution::maxPS(root, ret);return ret;}static int maxPS( TreeNode* root, int& maxSum){if ( !root ) return 0;int l = Solution::maxPS(root->left, maxSum);int r = Solution::maxPS(root->right, maxSum);maxSum = max(maxSum, root->val+(l>0?l:0)+(r>0?r:0));return max(root->val,root->val+max(r,l));} };?
轉載于:https://www.cnblogs.com/xbf9xbf/p/4511277.html
總結
以上是生活随笔為你收集整理的【Binary Tree Maximum Path Sum】cpp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度全面开放HTTPS之我见
- 下一篇: vs2010 常见问题处理