/** * 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 { private: int res = INT_MIN; int getMax(TreeNode* r) { if(r == NULL) return 0; int left = max(0, getMax(r->left)); // 如果子树路径和为负则应当置0表示最大路径不包含子树 int right = max(0, getMax(r->right)); res = max(res, r->val + left + right); // 判断在该节点包含左右子树的路径和是否大于当前最大路径和 return max(left, right) + r->val; } public: int maxPathSum(TreeNode* root) { /** 对于任意一个节点, 如果最大和路径包含该节点, 那么只可能是两种情况: 1. 其左右子树中所构成的和路径值较大的那个加上该节点的值后向父节点回溯构成最大路径 2. 左右子树都在最大路径中, 加上该节点的值构成了最终的最大路径 **/ getMax(root); return res; } };
分析:
做不出来啊,这是网友的思路,我想到了递归,但是没想到全局变量,导致我一直在想判断到底是左右节点都保留,还是只留最大的,没想到啊。唉,我还是不够看的。