leetcode二叉树 找路径_LeetCode124二叉树中的最大路径和

题目链接

题解

递归解法

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

这道题和LeetCode687最长同值路径和LeetCode543二叉树的直径很相似,都很难,每个题都做了很久

三道题的共性是dfs函数并非直接实现了目标功能,而是将目标功能拆解,实现目标功能的一部分,然后再利用某种关系(根节点、左子树、右子树之间的关系,需要结合题意)拼接出目标功能(求目标值)

思路见代码注释

需要高度注意dfs函数的功能

// Problem: LeetCode 124

// URL: https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/

// Tags: Tree Recursion DFS

// Difficulty: Hard

#include

#include

using namespace std;

struct TreeNode

{

int val;

TreeNode *left;

TreeNode *right;

};

class Solution

{

private:

int maxSum = INT_MIN; // 全局最大路径和

// 功能:求一颗树的最大路径和,要求从根节点开始,在左子树或右子树结束,也可不经过左子树和右子树,即至多经过一个子树

int dfs(TreeNode *root)

{

if (root == nullptr)

return 0;

int left = dfs(root->left);

int right = dfs(root->right);

// 过程中更新全局最大路径和:根节点必须经过,左右子树可经过可不经过

maxSum = max(maxSum, root->val + max(left, 0) + max(right, 0));

// 从根节点开始,在左子树或右子树结束,也可不经过左子树和右子树,即至多经过一个子树

return max(root->val, root->val + max(max(left, right), 0));

}

public:

// 求一颗树的最大路径和,不要求经过根节点,起始和终止节点任意

int maxPathSum(TreeNode *root)

{

dfs(root);

return this->maxSum;

}

};

欢迎讨论和交流!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值