*选择后序是因为选择方向确定,如果是前序的话,root左右两个节点不好选择,而后序能避免此问题; *
从叶子节点开始选择,两个子节点的值中选择最大值,如果比0小,放弃此路径,否则,每次都取一棵小子树的最大值,即(左中右)
int ans=-INT32_MAX; int dfs(TreeNode*root){ if(!root){ return 0; } int left=max(dfs(root->left),0); int right=max(dfs(root->right),0); ans=max(ans,root->val+left+right); return root->val+max(left,right); } int maxPathSum(TreeNode* root) { // write code here if(root==nullptr)return 0; dfs(root); return ans; }