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 };
  • 相关阅读:
    [转]: 浅谈Java中的equals和==
    易忘易混的java基本概念
    mysql查看锁表锁进程
    [转] Python 包管理工具解惑
    双网卡单网关的路由问题
    [转]火狐 SSL 收到了一个弱临时 Diffie-Hellman 密钥
    Linux中如何进入减号开头的目录中
    zabbix的一点记录
    从图形界面配置zabbix
    调用API自动配置zabbix version 3.0
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3547387.html
Copyright © 2011-2022 走看看