LeetCode 124

https://leetcode.cn/problems/binary-tree-maximum-path-sum/description/

难度:困难

这道题是树形 DP 中的直径 DP。枚举直径拐弯的位置,在每一个拐弯的位置更新答案,将以当前节点为根的链的最大路径和返回给父节点,如果路径和为负数返回 0。

边界条件是空节点的路径和为 0。

需要注意的是,更新答案的是直接的路径和,而返回的是链的路径和。

时间复杂度:O(n),其中 n 为二叉树的节点个数。

空间复杂度:O(n)。最坏情况下,二叉树退化成一条链,递归需要 O(n) 的栈空间。

class Solution {
public:
    int maxPathSum(TreeNode* root) {
        int ans = INT_MIN;
        auto dfs = [&](auto &&dfs, TreeNode* node) {
            if (node == nullptr) {
                return 0;
            }
            int l_val = dfs(dfs, node->left);
            int r_val = dfs(dfs, node->right);
            ans = max(ans, l_val + r_val + node->val);
            return max(0, max(l_val, r_val) + node->val);
        };
        dfs(dfs, root);
        return ans;
    }
};