LeetCode: Binary Tree Maximum Path Sum [124]

【题目】

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.

【题意】

给定一棵二叉树,找出其中路径和最大的路径,然会返回最大路径和。

本题中的路径不是从根节点到叶子节点这样的传统的路径,而是指的二叉树中任意两个节点之间的联通路径。

【思路】

最直观的方法是找出任意两点之间的路径,然后选择和最大的路径。这种最笨的方法单单找两个节点之间的路径就要分4步走:

1. 找到根到节点A的路径  O(logn)

2. 找到根到节点B的路径  O(logn)

3. 找出AB节点的最近公共祖先 O(logn)

4. 计算途经最近公共祖先的路径和

则搜索两两节点之间的路径的复杂就是O(n^2 logn), 显然是不可能接受的

为此,我们换个角度来看。根据上面的分析,要找两个节点A,B之间的路径,我们需要先找两个节点的最近公共祖先R。那么实际上,只要A和B分别位于R的左右两棵子树上,两点之间的路径都需要经过节点R。那么针对根为R的这棵子树,我们可以计算这棵子树上经过R的最大路径。而二叉树上每个节点都都可视为一棵子树的根,所以我们的求解目标变为:计算出每个节点上以此节点为转折点的最大路径。

那么这个最大路径怎么求呢?

我们假设要计算以R为转折点的最短路径,A和B分别是R的左孩子和右孩子,经过A和B的最大路径已知,如下:

path_left(A), path_right(A)分别表示以A为转折点的最小路径在A的左右子树上的两段,则以A为转折点的最小路径即为path_left(A)->A->path_right(A)

path_left(B), path_right(B)分别表示以B为转折点的最小路径在B的左右子树上的两段,则以B为转折点的最小路径即为path_left(B)->B->path_right(B)

那么经过R的最短路径就可以表示为:max(path_left(A), path_right(B)) -> A -> R -> B -> max(path_left(B), path_right(B))

所以,本题其实是一道典型的DP问题,上式即为迭代公式。

【代码】

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:

    int maxPath(int& maxSum, TreeNode *root){
        if(root==NULL)return 0;

        //计算来自左子树的最大路径和
        int maxLeft=maxPath(maxSum, root->left);
        //计算来自右子树的最大路径和
        int maxRight=maxPath(maxSum, root->right);
        //计算以当前节点为转折的最大路径和
        int curMaxSum=root->val;
        if(maxLeft>0)curMaxSum+=maxLeft;    //如果从左右孩子过来的最大和是负值,则连接到当前节点,负值会使合并后的路径和更小,因此只在路径和为正的时候再连接到当前节点,具体表现为路径和相加。
        if(maxRight>0)curMaxSum+=maxRight;
        //更新结果
        if(curMaxSum>maxSum)maxSum=curMaxSum;

        //同样需要考虑maxLeft和maxRight的正负
        int largerSum = max(maxLeft, maxRight);
        if(largerSum>0)return root->val+largerSum;
        else return root->val;
    }

    int maxPathSum(TreeNode *root) {
        if(root==NULL)return 0;
        int max=INT_MIN;
        maxPath(max, root);
        return max;
    }
};

LeetCode: Binary Tree Maximum Path Sum [124],布布扣,bubuko.com

时间: 2024-10-06 23:03:36

LeetCode: Binary Tree Maximum Path Sum [124]的相关文章

[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. /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNo

[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. [分析]    需要考虑以上两种情况: 1 左子树或者右子树中存有最大路径和 不能和根节点形成一个路径 2 左子树 右子树 和根节点形成最大路径 [代码] /******

LeetCode: Binary Tree Maximum Path Sum 解题报告

Binary Tree Maximum Path SumGiven 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 SOLUTION 1: 计算树的最长path有2种情况: 1. 通过根的path. (1)如果左子树从左树根到任何一个N

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. 原题链接:https://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ 题目:给定一二叉树,求出最大路径和. 分析:

[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. 题目意思很简单,就是给定一棵二叉树,求最大路径和.path 可以从任意 node 开始,到任意 node 结束. 这道题在 LeetCode 上的通过率只有 20% 多一点,并被标记

[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 Return6. 思路:题目中说明起始节点可以是任意节点,所以,最大的路径和不一样要经过root,可以是左子树中某一条,或者是右子树中某一条,当然也可能是经过树的根节点root的.递归式是应该是这三者中

[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. 这道求二叉树的最大路径和是一道蛮有难度的题,难就难在起始位置和结束位置可以为任意位置,我当然是又不会了,于是上网看看大神们的解法,看了很多人的都没太看明白,最后发现了网友Yu's C

leetcode——Binary Tree Maximum Path Sum

    这题很难,主要是我没理解题目的意思,后来看着给的测试参考,和网上找的答案,终于理解了. 例如: 给的 正确的路线应该是   也就是说,路径是一条的,不是有分叉的,之所以算出55是因为把>0的数都加上去了,这样路径就分叉了,就不是一条路径了,所以用dfs做时,返回值应该是左子树或者右子树中>0且比较大的那个子树的路径的值加上当前根节点的值. 我的是参考网上答案的代码: // 用dfs,因为路径是任意的,所以根节点也是任意的,如果左子树的值>0,即对sum有贡献,则sum加其值,右子

第四周 Leetcode 124. Binary Tree Maximum Path Sum (HARD)

124. Binary Tree Maximum Path Sum 题意:给定一个二叉树,每个节点有一个权值,寻找任意一个路径,使得权值和最大,只需返回权值和. 思路:对于每一个节点 首先考虑以这个节点为结尾(包含它或者不包含)的最大值,有两种情况,分别来自左儿子和右儿子设为Vnow. 然后考虑经过这个节点的情况来更新最终答案.更新答案后返回Vnow供父节点继续更新. 代码很简单. 有一个类似的很有趣的题目,给定一个二叉树,选择一条路径,使得权值最大的和最小的相差最大.参考POJ3728 cla