leetcode124.二叉树中的最大路径和

1.题目描述

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例 1:

输入: [1,2,3]

       1
      / \
     2   3

输出: 6
示例 2:

输入: [-10,9,20,null,null,15,7]

   -10
   / \
  9  20
    /  \
   15   7

输出: 42

2.解题思路

对于树中的每个点,递归计算完左右子树后,我们将左右子树维护的两条最大路径,和该点拼接起来,就可以得到以这个点为割点的最大路径。

对于每个结点来说,要知道经过其左孩子结点的 path 之和大还是经过右孩子节点的 path 之和大,递归函数dfs保存较大的path和值作为这个节点的返回值。递归函数返回值就可以定义为以当前结点为根结点,到叶节点的最大路径之和(左侧路径或者右侧路径)

在递归函数中,如果当前结点不存在,直接返回0。否则就分别对其左右子节点调用递归函数,由于路径和有可能为负数,这里当然不希望加上负的路径和,所以和0相比,取较大的那个,就是要么不加,加就要加正数。然后来更新全局最大值结果 res,就是以左子结点为终点的最大 path 之和加上以右子结点为终点的最大 path 之和,还要加上当前结点值,这样就组成了一个条完整的路径。而返回值是取 left 和 right 中的较大值加上当前结点值,因为返回值的定义是以当前结点为终点的 path 之和,所以只能取 left 和 right 中较大的那个值,而不是两个都要。

参考链接:https://www.cnblogs.com/grandyang/p/4280120.html

3.代码实现

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
import sys
class Solution(object):
    def __init__(self):
        self.ans=-sys.maxsize
    def dfs(self,root):
        if not root:
            return 0
        # 如果该节点为负数,相当于不要这个节点
        left=max(0,self.dfs(root.left))
        right=max(0,self.dfs(root.right))
        self.ans=max(self.ans,left+right+root.val)
        return max(left,right)+root.val
    def maxPathSum(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        self.dfs(root)
        return self.ans
        

 

你可能感兴趣的:(leetcode,面试题,二叉树,dfs)