这道题求最大的路径和,从上面的两个例子能看出来这道题须要考虑的点,首先它是须要考虑左右子树的,两个并不分开,其次其实中间的处理部分是一个动态规划的应用,首先定义一个全局变量,取最小值,这个值用来记录最终结果。而后DFS搜索两个子树,而且比较子树的和与0的大小,取其大的,记录两个子树与此时根节点的和,而后再和res比较,取其中大的做为res。须要注意的是DFS的边界条件和其返回值。node
/** * 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; };
DFS须要注意的点,一是递归结束的条件,一是知足要求的条件,还有不知足条件提早退出的条件(也就是剪枝),其他就是在各类条件下的递归。在DFS中经常使用一个全局变量来记录最终结果。code