1. 程式人生 > 實用技巧 >LeetCode124 二叉樹中的最大路徑和

LeetCode124 二叉樹中的最大路徑和

給定一個非空二叉樹,返回其最大路徑和。

本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。

對於每一個節點,計算一個以該節點為根節點,且經過該節點的子樹中的最大價值路徑,記為maxgain。maxgain等於該節點的值加上左子樹的maxgain或0,再加上右子樹的maxgain或0;這裡在子樹maxgain小於0的時候就用0,等於不要這邊。得到後用maxgain和當前的最大價值路徑比較,然後返回的時候返回的是隻加上更大一側字數的maxgain。

 1 /**
 2  * Definition for a binary tree node.
3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 private: 12 int maxsum=INT_MIN; 13 public: 14 int maxPathSum(TreeNode* root) { 15 recursive_maxgain(root);
16 return maxsum; 17 } 18 19 int recursive_maxgain(TreeNode* curNode){ 20 if(curNode==nullptr) 21 return 0; 22 int left_gain=recursive_maxgain(curNode->left); 23 int right_gain=recursive_maxgain(curNode->right); 24 int cursum=curNode->val;
25 if(left_gain>0) 26 cursum+=left_gain; 27 if(right_gain>0) 28 cursum+=right_gain; 29 maxsum=max(maxsum,cursum); 30 if(left_gain<0 && right_gain<0) 31 return curNode->val; 32 return curNode->val+max(left_gain,right_gain); 33 } 34 };