力扣 124. 二叉树中的最大路径和

题目来源:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/

大致题意:
给一个二叉树,若以父子关系为路径,在所有节点只能经过一次的情况下,所能经过的最大路径和

思路

对于叶节点来说,其最大路径和为其本身
对叶节点的父节点的子树来说,其最大路径为 max( max(左节点, 右节点, 0) + 节点值, 左节点 + 右节点 + 节点值)。并且若路径为后者 左节点 + 右节点 + 节点值,那么就不会再有该子树之外的节点可以添加进来,也就是只能在本子树中获得的最大路径和

于是,可以递归获取二叉数的最大路径和,当前子树对父节点的最大路径和贡献值即为

  • max(左子树的最大路径和, 右节点的最大路径和, 0) + 当前子树根节点值

同时,在遍历到每个子树时,维护一个最大值变量(即答案),其存当前左子树的最大路径和 + 右节点的最大路径和 + 当前子树根节点值中的最大值,即不能添加其它子树节点的路径,只能在本子树中获得的最大路径和

那么,最终的答案即为遍历中可以获得的最大值

class Solution {
    int ans;
    public int maxPathSum(TreeNode root) {
        // 最大路径和
        ans = Integer.MIN_VALUE;
        return Math.max(dfs(root), ans);
    }

    public int dfs(TreeNode node) {
        if (node == null) {
            return 0;
        }
        // 左子树的最大路径和
        int leftSum = dfs(node.left);
        // 右子树的最大路径和
        int rightSum = dfs(node.right);
        // 更新答案,leftSum + rightSum + node.val 为只能在本子树中获得的最大路径和
        ans = Math.max(leftSum + rightSum + node.val, ans);
        // 本子树对父节点的最大路径和贡献
        int curSum = Math.max(Math.max(leftSum, rightSum), 0) + node.val;
        // 更新答案
        ans = Math.max(curSum, ans);
        return curSum;
    }
}

你可能感兴趣的:(DFS,leetcode,算法,深度优先)