二叉树路径和最大python_二叉树的最大路径和

38

public class Solution {

int maxValue;

public int maxPathSum(TreeNode root) {

maxValue = Integer.MIN_VALUE;

maxPathDown(root);

return maxValue;

}

private int maxPathDown(TreeNode node){

if(node==null)

return 0;

int left = Math.max(0, maxPathDown(node.left));

int right = Math.max(0, maxPathDown(node.right));

maxValue = Math.max(maxValue, left + right + node.val);

return Math.max(left, right) + node.val;

}

}

发表于 2016-06-16 09:36:15

回复(11)

15

/*

* 124. Binary Tree Maximum Path Sum

* 解题思路:(转载自:http://blog.csdn.net/linhuanmars/article/details/22969069)

* 这道题是求树的路径和的题目,不过和平常不同的是这里的路径不仅可以从根到某一个结点,

* 而且路径可以从左子树某一个结点,然后到达右子树的结点,就像题目中所说的可以起始和终结于任何结点。

* 在这里树没有被看成有向图,而是被当成无向图来寻找路径。

* 因为这个路径的灵活性,我们需要对递归返回值进行一些调整,而不是通常的返回要求的结果。

* 在这里,函数的返回值定义为以自己为根的一条从根到子结点的最长路径(这里路径就不是当成无向图了,

* 必须往单方向走)。

* 这个返回值是为了提供给它的父结点计算自身的最长路径用,

* 而结点自身的最长路径(也就是可以从左到右那种)则只需计算然后更新即可。

* 这样一来,一个结点自身的最长路径就是它的左子树返回值(如果大于0的话),

* 加上右子树的返回值(如果大于0的话),再加上自己的值。

* 而返回值则是自己的值加上左子树返回值,

* 右子树返回值或者0(注意这里是“或者”,而不是“加上”,因为返回值只取一支的路径和)。

* 在过程中求得当前最长路径时比较一下是不是目前最长的,如果是则更新。

* 算法的本质还是一次树的遍历,所以复杂度是O(n)。而空间上仍然是栈大小O(logn)。

*/

// 因为maxPathSum不一定经过根节点,所以用maxValue整个遍历过程中出现过的最大值

int maxValue = 0;

public int maxPathSum(TreeNode root) {

if (root == null)

return 0;

maxValue = Integer.MIN_VALUE;

getMaxPathSum(root);

return maxValue;

}

private int getMaxPathSum(TreeNode root) {

if (root == null)

return 0;

//因为节点的值可以为负数,所以最大值取0和子树值的较大者

int leftMax = Math.max(0, getMaxPathSum(root.left));

int rightMax = Math.max(0, getMaxPathSum(root.right));

//如果将当前root作为根节点,那么最大值是root.val+左子树最大值+右子树最大值

maxValue = Math.max(maxValue, root.val + leftMax + rightMax);

//只能返回左右子树中较大值加上root.val

return Math.max(0, root.val + Math.max(leftMax, rightMax));

}

编辑于 2017-08-09 11:20:00

回复(6)

5

class Solution {

public: int Max;

int maxPathSum(TreeNode *root) {

Max = INT_MIN;

maxSum(root); return Max;

}

int maxSum(TreeNode *root){

if(root == NULL)

return 0;

int l_Max = max(0, maxSum(root->left));

int r_Max = max(0, maxSum(root->right));

Max = max(Max, l_Max + r_Max + root->val);

return max(l_Max, r_Max) + root->val; }

};

发表于 2017-09-20 15:14:02

回复(0)

8

这一题有点类似一维数组求最大子序列的和,一维最大子序列和从一维的角度判断,这里二叉树有左右子树考虑。

maxpath(root)方法的返回值的意思就是求得root节点到该root子孙的任意一节点的最大路径值(注意区别这里root和根节点root,这里root是递归下去的节点)。在这个函数里还比较了以root为路径节点

if

(maxsum < sum)

maxsum = sum;//

int maxsum = Integer.MIN_VALUE;// 初始化为最小值

public int maxPathSum(TreeNode root) {

if (root == null)

return 0;

maxSum(root);

return maxsum;

}

public int maxSum(TreeNode root) {

if (root == null)

return 0;

int left = maxSum(root.left);

int right = maxSum(root.right);

int sum = root.val;

if (left > 0)

sum += left;

if (right > 0)

sum += right;

if (maxsum < sum)

maxsum = sum;

return Math.max(left, right) > 0 ? Math.max(left, right) + root.val :

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值