Binary Tree Max Path Sum

题目描述

Given a binary tree, find the maximum path sum.

For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path does not need to go through the root.

For example: Given the below binary tree,

       1
      / \
     2   3
Return 6.

解题方法

对于数的问题,很多都可以用recursive的思想来解,其实也就是divide and conquer, 将大问题不断地分解成小问题。 我们可以通过发现root的结果与左右child的结果有什么关系 来入手。

对于每一个root, 这个max path sum有三种可能:

  • 不通过root, 在左子树里
  • 不通过root, 在右子树里
  • 通过root,与左右两边的child连接

对于每个root都要比较这三种情况,从而得到最大的path sum, 所以在child往上返回 的时候,不仅仅要返回最大的值,也要返回以这个child自身为一个end的最大path sum. 有一点像DP里面global, local的关系。

所以每个recursive call会返回两个值,再进行比较判断。在判断比较的时候也要注意, 选取global最大结果的时候要取max,而在取通过自己的single path sum的时候,还要与0比较, 因为如果结果是负的,在上面连接这一个child的时候就应该将它舍去,就是0.

recursive返回的条件:

当节点为None的时候,因为节点value也有可能是负数,所以maxpathsum应该是最小整数 ,对于Python就是-sys.maxint,而通过它自申的最大path sum是0

Solution

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def maxPathSum(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        maxPathSum, single = self.PathSumHelper(root)
        return maxPathSum

    def PathSumHelper(self, root):
        if not root:
            return -sys.maxint, 0

        leftMax, leftSingle = self.PathSumHelper(root.left)
        rightMax, rightSingle = self.PathSumHelper(root.right)
        globalMax = max(leftMax, rightMax, root.val + leftSingle + rightSingle)
        singleMax = max(leftSingle + root.val, rightSingle + root.val, 0)

        return globalMax, singleMax

Reference