Leetcode 124 二叉樹中的最大路徑和 (遞迴)
阿新 • • 發佈:2018-11-11
給定一個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。
示例 1:
輸入: [1,2,3] 1 / \ 2 3 輸出: 6
示例 2:
輸入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7 輸出: 42
分為兩種情況:
1.若當做根節點:
則分別求出兩個子樹的路徑和leftsum和rightsum。
兩個數如果大於0的話就加上路徑,如果小於的話則不加。
2.不當做根節點:
則只需要處理三條路徑中最長的一條即可。
程式碼如下:
/** * 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=-0x3f3f3f3f; FindMax(root,Max); return Max; } int FindMax (TreeNode* root,int &Max) { if(root==NULL) { return 0; } int leftsum=0,rightsum=0; if(root->left) leftsum=FindMax(root->left,Max); if(root->right) rightsum=FindMax(root->right,Max); int sum=0; if(leftsum>=0) sum+=leftsum; if(rightsum>=0) sum+=rightsum; sum+=root->val; Max=max(Max,sum); return max(root->val,max(root->val+leftsum,root->val+rightsum)); } };