java在二叉树中求根到叶的最大和路径_leetcode No.124 二叉树中的最大路径和

596c17be464c779128f726b0fb2fbc26.png

有时候,路径未必非得从根节点开始。

题目链接:

二叉树中的最大路径和 - 力扣(LeetCode)​leetcode-cn.com
086647a162cc47054ca3fe9fe8125d89.png

题目描述:

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例 1:

输入: [1,2,3]

       1
      / 
     2   3

输出: 6

示例 2:

输入: [-10,9,20,null,null,15,7]

   -10
   / 
  9  20
    /  
   15   7

输出: 42

解题思路:

本题中的最大和路径未必从根节点开始,但是我们可以分而治之。

最大路径和可能出现在三种情况中:

  • 左子树
  • 右子树
  • 根节点与左右子树

实现的时候仍然是DFS递归就好了,有一点需要注意的是,函数返回值和求最大路径和之间计算的差异

在递归的过程中,函数返回的是此节点与左右子树中最大值的和(想往上的话只能选择左右子树当中的一支,所以是root->val +max(l,r)),小于0或较小的解直接被舍弃,不会再被用到。

在这个过程中,最大值maxsum会不断更新,与其比较的是当前节点与其左右子树最大值之和(求最大路径和的时候可以包含左右子树,所以是l+r+root->val)。

代码如下:

class Solution {
public:
    int maxPathSum(TreeNode* root) {
        int maxsum = INT_MIN;
        dfs(root, maxsum);
        return maxsum;
    }
    int dfs(TreeNode* root, int& maxsum){
        if(!root) return 0;
        int l = dfs(root->left, maxsum); // 右边最大值
        int r = dfs(root->right, maxsum); // 左边最大值
        maxsum = max(l+r+root->val, maxsum); // 和当前最大值比较
        return max(0, root->val + max(l,r)); // 剪枝掉所有小于0的路径
    }
};

如果有任何疑问,欢迎提出。如果有更好的解法,也欢迎告知。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值