看到困难题被吓了一下,实际上做起来还是很简单的。
思路是DFS+递归,先要记录一个最终结果result,每次递归左右节点的最大路径,选左右里最大的连接树节点,还要比较result和左右中节点加起来的路径,若左右中节点加起来的路径大则替换result。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int result=-1000;int dfs(TreeNode* tree){if(tree==NULL) return 0;int l=dfs(tree->left);int r=dfs(tree->right);int treemax;if(l>0&&r>0) result=max(result,l+r+tree->val);if(l>0||r>0) treemax=max(l,r)+tree->val;else treemax=tree->val;result=max(result,treemax);return treemax;}int maxPathSum(TreeNode* root) {dfs(root);return result;}
};