Binary Tree Maximum Path Sum

原题

https://leetcode.com/problems/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.
翻译:在一棵二叉树中找到和最大的一条路径()这条路径起点和终点在二叉树的某个位置就行。

思路

  这个问题看到以后其实没什么思路,然后在Discuss中看到了下面的代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    int flag = INT_MIN;
public:
    int maxPathSum(TreeNode* root) {
        getSum(root);
        return flag;
    }

    int getSum(TreeNode* root)
    {
        if(root == NULL) return 0;
        int a = getSum(root->left);
        int b = getSum(root->right);
        flag = max(flag , root->val + a + b);
        return max(0,root->val + max(a,b));
    }
};

  然后想了想,果然不错。有必要解释一下这一段代码。

代码解释

  看到INT_MIN这种值,肯定就是用来记录最大值的标记。
  getSum函数是干什么的呢——他求的是包含root节点的,从root到叶节点的和最大的路径(从root开始,不一定要到叶子节点,甚至可以不包含root),这个路径的最小值是0(大不了不包含任何节点)。
  那么函数的语句就可以理解了,return max(0,root->val + max(a,b)),就是返回0或者根节点的值加上两个子树最大的getSum的值。
  并且flag = max(flag , root->val + a + b);就是用来不断的刷新可能的最大的值(这里root->val + a + b就是过root的路径的最大值,当然路径可能不过root,getSum(root->left);和getSum(root->right);的时候会进行比较过滤。
  可以看出,思路简洁,巧妙!
  接下来,我们来讨论讨论话务预测的项目~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值