码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode124二叉树中的最大路径和

时间:2020-07-27 23:35:37      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:树的直径   htm   mes   函数   algo   更新   节点   etc   之间   

题目链接

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

题解

  • 递归解法
  • 路径:一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
  • 这道题和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 <iostream>
#include <algorithm>
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;
    }
};

作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!


LeetCode124二叉树中的最大路径和

标签:树的直径   htm   mes   函数   algo   更新   节点   etc   之间   

原文地址:https://www.cnblogs.com/chouxianyu/p/13386394.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!