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

题目描述

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

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

示例 1:

输入: [1,2,3]

       1
      / \
     2   3

输出: 6
示例 2:

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

   -10
   / \
  9  20
    /  \
   15   7

输出: 42

解题思路

这里所求的最大路径的起点和终点并非根节点和叶子节点,而是二叉树中的任意两个节点。经过任意节点的路径有以下情况:

  • 该节点本身
  • 过该节点左子节点的最大路径 + 该节点
  • 过该节点右子节点的最大路径 + 该节点
  • 过该节点的左子节点最大路径 + 该节点 + 过该节点的右子节点最大路径

假设该节点值为val,左子节点最大路径和为l,右子节点最大路径和为r,那么最大路径和应当是max(val, l+val, r+val, l+r+val)。

有一点需要注意,在计算当前节点的路径和时,这里需要计算左右子节点的最大路径和,这里不能返回左右子节点路径和的第4种情况。
举个例子,将示例二中的根结点-10换成10,其右子结点为20,按照前面的说法,过根结点10的最大路径和的一种可能就是过其右子结点的最大路径和再加上根结点10,此时如果在计算过其右子结点的最大路径和的时候计算了第④种情况,那么最大路径和最终就必然是10+15+20+7,这显然是不正确的,因为这条路径横跨了根结点10的右子结点的左右子树,是无法达到根结点的。

实现

int maxPathSum(TreeNode* root){
     int maxSum = INT_MIN;
     helper(root, maxSum);
     return m;
}

int helper(TreeNode* root, int &m){
    if(root==nullptr)
        return 0;
    
    int l = helper(root->left, m);
    int r = helper(root->right, m);
    int curSum = max(root->val, max(root->val+l, root->val+r));
    m = max(m, max(curSum, root->val+l+r));
    
    return curSum;
}

你可能感兴趣的:(124. 二叉树中的最大路径和)