[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.

分析:

首先,这道题的解决方案是用递归。对于一棵树来说,maximum path可能是经过root、贯穿左右的一条path;有可能是一条经过root但不贯穿的path(只有左边或者只有右边);也由可能是一条只在一边的path。但值得注意的是,如果是一条贯穿左右的path,则在我们recurse on left subtree and right subtree的时候,一定要选择第二种情况,即经过root但不管穿的path,把他们组合起来才变成一条贯穿的。所以,代码如下。

代码:

class Solution {
public:
	int maxPathSumHelper(TreeNode *root, int &result) {
		if (!root)
			return 0;
		int l = maxPathSumHelper(root->left, result);
		int r = maxPathSumHelper(root->right, result);
		int arch = l + r + root->val;
		int single = max(root->val, max(l + r) + root->val);
		result = max(result, max(arch, single));
		return single;
	}

	int maxPathSum(TreeNode *root) {
		int result = INT_MIN;
		if (!root) return 0;
		maxPathSumHelper(root, result);
		return result;
	}
};

注意,maxPathSumHelper返回的是single。这就是我上面说的原因:因为我们要用这个返回值来组合一条arch,所以必须是single。但也不用担心,因为我们早在上一行就已经把max放在了result里面,所以没关系。这个递归稍稍不同于一般的递归:它的返回值和我们真正要的东西不是用一个东西。这里的返回值是用来进一步递归的,而不是真正我们需要返回的东西。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值