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

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。

示例1:
image

输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例2:
image

输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

提示:

  • 树中节点数目范围是 [1, 3 * 104]
  • -1000 <= Node.val <= 1000

代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //res用来存储最大路径和,初始值为整型的最小值
    int res = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        //递归计算最大路径和
        dfs(root);
        //返回最大路径和
        return res;
    }
    //dfs用于计算以root为起点的最大路径和,由于是以root为起点,所以只能选择往左走或者往右走,不能同时走左节点和右节点
    public int dfs(TreeNode root){
        //如果当前节点为null,直接返回0
        if(root == null)return 0;
        //递归计算左右子节点的最大贡献值
        //只有当贡献值大于0时,才会选择对应子节点
        int l = Math.max(0,dfs(root.left));
        int r = Math.max(0,dfs(root.right));
        //节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值
        res = Math.max(res,root.val+l+r);
        //1.第一种情况,由于l,r都大于等于0,当l和r都等于0时,说明往左走和往右走最大路径和都不会增加,所以以当前节点为起点的最大路径和就是该节点的值
        //2.第二种情况,当l和r都大于0时,说明往左走和往右走最大路径和都会增加,所以以当前节点为起点的最大路径和就是该节点的值+max(l,r)
        //3.第三种情况,当l大于0,r等于0时,说明往左走最大路径和会增加,往右走最大路径和不会增加,所以以当前节点为起点的最大路径和就是该节点的值+l
        //4.第四种情况,当l等于0,r大于0时,说明往左走最大路径和不会增加,往右走最大路径和会增加,所以以当前节点为起点的最大路径和就是该节点的值+r
        return Math.max(root.val+l,root.val+r);
    }
}
posted @ 2025-04-30 09:54  回忆、少年  阅读(21)  评论(0)    收藏  举报