题目大意
解题思路
hard就是细节多,来回对着error case调了好几次。思考不全面or懒得思考。
因为节点val可以为负值,所以任何0都要注意,是否会影响到结果。
同时,对二叉树遍历理解的不够透彻,没必要那么麻烦,每个左右子节点,在此之前,也是子树的根节点,也和ans取过max,所以不用再单独考虑了。只需要考虑两件事,当前节点连接左右孩子的路径和返回只能选取一个孩子的路径。
Code
/*** 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 ans;int dfs(TreeNode* cur) {int l, r;if (cur->left == nullptr && cur->right == nullptr) {ans = max(ans, cur->val);return cur->val;}if (cur->left != nullptr && cur->right == nullptr) {l = dfs(cur->left);if (l < 0) l = 0; //discradans = max(ans, cur->val + l);return cur->val + l;}if (cur->left == nullptr && cur->right != nullptr) {r = dfs(cur->right);if (r < 0) r = 0; //discardans = max(ans, cur->val + r);return cur->val + r;}else {l = dfs(cur->left);r = dfs(cur->right);ans = max(ans, max(l, r)); //不连接,单侧if (l < 0) l = 0;if (r < 0) r = 0;//int tmp = cur->val > 0 ? cur->val : 0;ans = max(ans, cur->val + l + r);//连接至少一侧return cur->val + max(l, r);}}int maxPathSum(TreeNode* root) {ans = root->val;dfs(root);return ans;}};
