【DFS】LeetCode 124. 二叉树中的最大路径和

题目链接

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

思路

一个子树内部的最大路径和 = 左子树提供的最大路径和 + 根节点值 + 右子树提供的最大路径和。即 dfs(root.left)+root.val+dfs(root.right)

定义dfs函数:返回当前子树能向父节点“提供”的最大路径和。即,一条从父节点延伸下来的路径,能在当前子树中捞取的最大收益。分三种情况:

  1. 路径停在当前子树的根节点,在当前子树的最大收益:root.val + 0
  2. 走左子树:root.val + dfs(root.left)
  3. 走右子树:root.val + dfs(root.right)

使用 Math.max(leftValue + root.val, rightValue + root.val) 来获取左右子树的贡献最大值,因为贡献有可能是负数,所以需要 return Math.max(max, 0)

代码

class Solution {
    private int result = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        dfs(root);

        return this.result;
    }

    private int dfs(TreeNode root){
        if(root == null){
            return 0;
        }

        int leftValue = dfs(root.left);
        int rightValue = dfs(root.right);

        result = Math.max(result, root.val + leftValue + rightValue);
        // 计算当前分支对父结点的贡献
        int max = Math.max(leftValue + root.val, rightValue + root.val);

        // 如果贡献值为负数,则返回值为0,说明没有选择这个结点
        return Math.max(max, 0);
    }
}
posted @ 2023-02-02 10:48  Frodo1124  阅读(29)  评论(0编辑  收藏  举报