• Leetcode | Binary Tree Maximum Path Sum


    Given a binary tree, find the maximum path sum.

    The path may start and end at any node in the tree.

    For example:
    Given the below binary tree,

    1
    /
    2 3
    Return 6.

    最大值是以下几种情况的最大值:

    1. 左子树的最大值;

    2. 右子树的最大值;

    3. 部分path在左子树,部分path在右子树,经过root;

    1和2很多计算,在递归中保持就行,这里用maxDouble表示(两边都有);

    3的话需要维护止于root点的最大值,这里用maxSingle表示(只有一边,止于root);

    初始值的话不能设成0、-1之类的某个数,因为这些数可能出现,也可能不出现,因为是最大值比较,所以用INT_MIN;

     1 class Solution {
     2 public:
     3     int maxPathSum(TreeNode *root) {
     4         int maxDouble = INT_MIN, maxSingle = INT_MIN;
     5         recursive(root, maxDouble, maxSingle);
     6         return maxDouble;
     7     }
     8     
     9     void recursive(TreeNode* root, int &maxDouble, int &maxSingle) {
    10         if (root == NULL) return;
    11         int v1, v2, v3, v4;
    12         v1 = v2 = v3 = v4 = INT_MIN;
    13         recursive(root->left, v1, v2);
    14         recursive(root->right, v3, v4);
    15         maxSingle = v2 > v4 ? v2 : v4;
    16         if (maxSingle < 0) maxSingle = root->val;
    17         else maxSingle += root->val;
    18         
    19         maxDouble = maxSingle; 
    20         if (v1 > maxDouble) maxDouble = v1;
    21         if (v3 > maxDouble) maxDouble = v3;
    22         if (v2 != INT_MIN && v4 != INT_MIN && v2 + v4 + root->val > maxDouble) maxDouble = v2 + v4 + root->val;
    23     }
    24 };

    maxSingle很好求,可以先求左右maxSingle的最大值,如果这个值是正数,那么可以把root也算上,不然就直接是root了。

    maxDouble至少是maxSingle,然后再和左右子树的maxDouble比,最后和经过root,包含左右子树的情况相比。注意的是排除掉左右子树为空的情况。

    Cheers!庆祝Leetcode终于刷了100题。44天,当然中间大部分时间是要忙实验室的活,还有放假出去玩的时间,真正在做的时间一般多。

  • 相关阅读:
    [JSOI2018]潜入行动
    [ZJOI2013]丽洁体
    [CTSC2017]吉夫特
    [SDOI2016]储能表
    POJ-3616 Milking Time
    POJ-2385 Apple Catching---DP
    POJ-2229 Sumsets---完全背包变形
    hdu-1114 Piggy-Bank---完全背包
    POJ-3050 Hopscotch---DFS
    POJ-3187 Backward Digit Sums---枚举全排列
  • 原文地址:https://www.cnblogs.com/linyx/p/3710484.html
Copyright © 2020-2023  润新知