力扣124. 二叉树中的最大路径和
又一道困难题目,自行顺利解决,记录一下自己思路。
树形DP,由子节点的最终结果决定父节点,然后自底向上,依次递推(其实就是DFS),这是基本思路。
几个注意点:
① 题目中说,不一定要经过总的根节点,所以每次递归的时候,都假设一下,这个节点就作为最终根节点的话,统计一下是否是最大值,但是要注意的是,这个最大统计出来以后,仅仅更新结果,并不作为return值返回,因为return的值不能当前节点当作总根。
② 如果左右节点都是负优化,就直接抛弃左右就好了,将当前节点的值返回。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode() : val(0), left(nullptr), right(nullptr) {} 8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 10 * }; 11 */ 12 class Solution { 13 public: 14 int dfs(TreeNode* root) { 15 if (!root) 16 return 0; 17 18 int l = dfs(root->left); 19 int r = dfs(root->right); 20 int tres = max(max(l, r) + root->val, root->val); 21 m_res = max(max(tres, l + r + root->val), m_res); 22 return tres; 23 } 24 int maxPathSum(TreeNode* root) { 25 m_res = INT_MIN; 26 dfs(root); 27 return m_res; 28 } 29 30 private: 31 int m_res; 32 };