• LeetCode


    Binary Tree Maximum Path Sum

    2014.2.12 23:49

    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.

    Solution:

      The maximum path sum of a tree is a path from two nodes in the tree, that sums up to the maximal value possible. The path can always be divided into three parts: root, left path, right path. There might be nodes with negative weight, so the left and right paths could be empty when it is impossible to find a path with positive weight sum.

      The maximum path sum of node root consists of root->val, the left path sum and the right path sum. That's exactly how the recursion is defined.

      The return value of the recursive function is the maximal single path sum you can get from the node root, it's either left path or right path, but the result we desire is the maximum path sum possible, which includes both paths. Thus we'll need another global variable to record the greatest one.

      Here in my code, sum_single refers to the top-down single path, while sum_double refers to the path sum defined in the problem description.

      Total time complexity is O(n). Space complexity is O(n) as well.

      T(n) = 2 * T(n / 2) + O(1), you know how to prove T(n) = O(n), right?

    Accepted code:

     1 // 1WA, 1AC, recursive solution in O(n) time.
     2 #include <algorithm>
     3 #include <climits>
     4 using namespace std;
     5 
     6 /**
     7  * Definition for binary tree
     8  * struct TreeNode {
     9  *     int val;
    10  *     TreeNode *left;
    11  *     TreeNode *right;
    12  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    13  * };
    14  */
    15 class Solution {
    16 public:
    17     int maxPathSum(TreeNode *root) {
    18         max_val = INT_MIN;
    19         maxPathSumRecursive(root);
    20         
    21         return max_val;
    22     }
    23 private:
    24     int max_val;
    25     
    26     // return the maximum root-to-leaf sum, the 'root' refers to the current node as the root.
    27     int maxPathSumRecursive(TreeNode *root) {
    28         if (root == nullptr) {
    29             return 0;
    30         }
    31         // the root-to-leaf sum
    32         int sum_single;
    33         // the leaf-to-leaf or root-to-leaf sum
    34         int sum_double;
    35         int max1 = 0, max2 = 0;
    36         
    37         sum_double = sum_single = root->val;
    38         if (root->left != nullptr) {
    39             max1 = maxPathSumRecursive(root->left);
    40             if (max1 < 0) {
    41                 max1 = 0;
    42             }
    43         }
    44         if (root->right != nullptr) {
    45             max2 = maxPathSumRecursive(root->right);
    46             if (max2 < 0) {
    47                 max2 = 0;
    48             }
    49         }
    50         sum_single += max(max1, max2);
    51         sum_double += max1 + max2;
    52         if (sum_double > max_val) {
    53             max_val = sum_double;
    54         }
    55         
    56         return sum_single;
    57     }
    58 };
  • 相关阅读:
    SQL Sever 各版本下载
    使用REPLACE更新某表中某个字段详细内容【SQL语句】
    常用css简写
    CSS hack:区分IE6,IE7,IE8,firefox
    浅析vue中的provide / inject 有什么用处
    Git常用命令总结
    ts
    学会使用Vue JSX,一车老干妈都是你的
    关于javascript的Object. hasOwnProperty,看我就够了
    JavaScript进阶笔记(七):异步任务和事件循环
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3547387.html
Copyright © 2020-2023  润新知