zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    FastJSON使用笔记
    使用mysql-connector-java出现的错误
    Maven的学习
    前端部分-CSS基础介绍
    前端知识之HTML内容
    python--使用pymyslq操作数据库
    python---反射详解
    python----re正则模块详解
    python---str和repr
    python---random模块详解
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3547387.html
Copyright © 2011-2022 走看看