博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode124 Binary Tree Maximum Path Sum
阅读量:5009 次
发布时间:2019-06-12

本文共 2753 字,大约阅读时间需要 9 分钟。

Given a binary tree, find the maximum path sum. (Hard)

For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain at least one node and does not need to go through the root.

For example:

Given the below binary tree,

1      / \     2   3

 

Return 6.

 

分析:

问题是从树种任意点到任意点的最大path sum,且至少有一个点在路径上。

先考虑一个简单的问题,从顶点到任意点的最短路径(可以不包含任何点,即为0)

这样可以用一个简单的递归实现:

int singleSum(TreeNode* root) {        if (root == nullptr) {            return 0;        }        return max(0,root -> val + max(singleSum(root -> left), singleSum(root -> right)));}

再考虑pathSum与singleSum的关系;

pathSum采用分治的思想,可以求左子树的pathSum和右子树的pathSum,最后剩下的部分就是跨越根节点的pathSum

实际上也就是root->val加上左右子树的singlePath之和(如果小于0就不要了)。

程序:

1 /** 2  * Definition for a binary tree node. 3  * struct TreeNode { 4  *     int val; 5  *     TreeNode *left; 6  *     TreeNode *right; 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8  * }; 9  */10 class Solution {11     int singleSum(TreeNode* root) {12         if (root == nullptr) {13             return 0;14         }15         return max(0,root -> val + max(singleSum(root -> left), singleSum(root -> right)));16     }17 public:18     int maxPathSum(TreeNode* root) {19         if (root == nullptr) {20             return -0x7FFFFFFF;21         }22         int leftSum = maxPathSum(root -> left);23         int rightSum = maxPathSum(root -> right);24         int midSum = root -> val + max(0, (singleSum(root -> left) + singleSum(root -> right)));25         return max(midSum,max(leftSum, rightSum));26     }27 };

 

但是一组大样例居然超时了,考虑一下重复计算确实不少,给singleSum加一个hash表即可。

代码:

1 /** 2  * Definition for a binary tree node. 3  * struct TreeNode { 4  *     int val; 5  *     TreeNode *left; 6  *     TreeNode *right; 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8  * }; 9  */10 class Solution {11     unordered_map
hash;12 int singleSum(TreeNode* root) {13 if (root == nullptr) {14 return 0;15 }16 if (hash.find(root) != hash.end()) {17 return hash[root];18 }19 int result = max(0,root -> val + max(singleSum(root -> left), singleSum(root -> right)));20 hash[root] = result;21 return result;22 }23 public:24 int maxPathSum(TreeNode* root) {25 if (root == nullptr) {26 return -0x7FFFFFFF;27 }28 int leftSum = maxPathSum(root -> left);29 int rightSum = maxPathSum(root -> right);30 int midSum = root -> val + max(0, (singleSum(root -> left) + singleSum(root -> right)));31 return max(midSum,max(leftSum, rightSum));32 }33 };

 

转载于:https://www.cnblogs.com/wangxiaobao/p/6123696.html

你可能感兴趣的文章
css定位position属性深究
查看>>
android中不同版本兼容包的区别
查看>>
Static 与 new 的问题【待解决】
查看>>
xml
查看>>
在 mvc4 WebApi 中 json 的 跨域访问
查看>>
敏捷开发文章读后感
查看>>
xposed获取context 的方法
查看>>
html5 canvas 图像处理
查看>>
He who hesitates is Lost
查看>>
php中引用&的真正理解-变量引用、函数引用、对象引用
查看>>
关于<form> autocomplete 属性
查看>>
OutOfMemory
查看>>
LeetCode:组合总数III【216】
查看>>
Thinkphp框架回顾(三)之怎么实现平常的sql操作数据库
查看>>
虚函数的效率问题
查看>>
POJ 1860 Currency Exchange(SPFA 判断有无“正”环)
查看>>
广告地址屏蔽
查看>>
收缩SqlServer数据库日记方法
查看>>
每日英语:15 places to find inspiration
查看>>
学习方法--提问
查看>>