zoukankan      html  css  js  c++  java
  • 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天,当然中间大部分时间是要忙实验室的活,还有放假出去玩的时间,真正在做的时间一般多。

  • 相关阅读:
    【Anagrams】 cpp
    【Count and Say】cpp
    【Roman To Integer】cpp
    【Integer To Roman】cpp
    【Valid Number】cpp
    重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改
    Maven项目聚合 jar包锁定 依赖传递 私服
    Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
    mysql案例~tcpdump的使用
    tidb架构~本地化安装
  • 原文地址:https://www.cnblogs.com/linyx/p/3710484.html
Copyright © 2011-2022 走看看