Leetcode 124. 二叉树的最大路径和【递归】

16 篇文章 1 订阅
11 篇文章 0 订阅

问题描述

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

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

解题报告

以某一子树的根节点【非父节点】为研究对象,如果最大路径经过该子树的根节点,则必定 只经过该子树 左右子树 中的某一子树,即int ret = root->val + max(0, max(left, right))
实现时:

  • 设置全局变量 val,它记录了整棵树的最大路径和。
  • 递归搜索每棵子树的根节点,其返回经过该子树根节点的的最大路径和【该路径只经过该子树的某一子树】。
  • 在递归的过程中,更新 val 的值【在本身的值以及经过递归子树的根节点(是否包含 递归子树 左右子树的最大路径和 取决于 经过左右子树的最大路径和 是否大于0)这两者中取最大值】

2023/01/23 这道题比较特殊的点在于:递归的结果并不是最终的答案,而是在递归的过程中寻找答案

  • 具体参考代码

实现代码

class Solution {
public:
    int maxPathSum(TreeNode* root, int &val)
{
	if (root == nullptr) return 0;
	int left = maxPathSum(root->left, val);
	int right = maxPathSum(root->right, val);
    
	int lmr = root->val + max(0, left) + max(0, right);
	int ret = root->val + max(0, max(left, right));
	val = max(val, lmr);
    cout<<root->val<<" "<<left<<" "<<right<<" "<<lmr<<" "<<ret<<" "<<val<<endl;
	return ret;
}

int maxPathSum(TreeNode* root) 
{
	int val = INT_MIN;
	maxPathSum(root, val);
	return val;
}

// 作者:ikaruga
// 链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/er-cha-shu-zhong-de-zui-da-lu-jing-he-by-ikaruga/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
};

2 ^{2} 2

参考资料

[1] Leetcode 124. 二叉树的最大路径和
[2] 题解区:ikaruga

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值