1、题目描述
2、分析
这道题求最大的路径和,从上面的两个例子能看出来这道题需要考虑的点,首先它是需要考虑左右子树的,两个并不分开,其次其实中间的处理部分是一个动态规划的应用,首先定义一个全局变量,取最小值,这个值用来记录最终结果。然后DFS搜索两个子树,并且比较子树的和与0的大小,取其大的,记录两个子树与此时根节点的和,然后再和res比较,取其中大的作为res。需要注意的是DFS的边界条件和其返回值。
3、代码
/**
* 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) {
DFS(root);
return res;
}
int DFS(TreeNode * root){
if(root==NULL) return 0;
int left=max(0,DFS(root->left));
int right=max(0,DFS(root->right));
res=max(res,root->val+left+right);
return max(left,right)+root->val;
}
private:
int res=INT_MIN;
};
4、相关知识点
DFS需要注意的点,一是递归结束的条件,一是满足要求的条件,还有不满足条件提前退出的条件(也就是剪枝),其余就是在各种条件下的递归。在DFS中常用一个全局变量来记录最终结果。