二叉树中的最大路径和-LintCode

204 篇文章 0 订阅

给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)
样例
给出一棵二叉树:

   1
  / \
 2   3

返回 6

思路
利用递归,考虑两种情况的值:第一种结点node的左右结点都在路径上,此时路径和包括node结点及其左右子树的值;第二种情况node结点的左子树或者右子树在路径上,此时路径和包括node结点的值以及左右子树的最大值。比较这两种情况下,路径的和,并修改二叉树,将root的值加上左右子树的最大值。同时要考虑存在值为负数的情况,需要遍历二叉树中的所有结点值,对于左右子树存在值为负数的,在计算最大路径和与修改结点值时,将其值置为0。

#ifndef C94_H
#define C94_H
#include<iostream>
using namespace std;
class TreeNode{
public:
    int val;
    TreeNode *left, *right;
    TreeNode(int val)
    {
        this->val = val;
        this->left = this->right = NULL;
    }
};
class Solution {
public:
    /**
    * @param root: The root of binary tree.
    * @return: An integer
    */
    int maxPathSum(TreeNode * root) {
        // write your code here
        if (!root)
            return 0;
        if (!root->left && !root->right)
            return root->val;
        //保证遍历到每个结点的值
        maxLen = maxVal(maxLen, root->val);
        //递归地处理左右结点
        maxPathSum(root->left);
        maxPathSum(root->right);
        //当左右结点的值大于0时才与root的值相加
        //之后修改root的值
        int Left = 0, Right = 0;
        if (root->left&&root->left->val>0)
            Left = root->left->val;
        if (root->right&&root->right->val>0)
            Right = root->right->val;
        int res = Left + Right + root->val;
        maxLen = maxVal(res, maxLen);
        root->val = maxVal(Left, Right) + root->val;
        return maxLen;
    }
    int maxVal(int a, int b)
    {
        return a > b ? a : b;
    }
    int maxLen = INT_MIN;
};
#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值