博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】124. Binary Tree Maximum Path Sum
阅读量:6279 次
发布时间:2019-06-22

本文共 2173 字,大约阅读时间需要 7 分钟。

题目如下:

Given a non-empty 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 must contain at least one node and does not need to go through the root.

Example 1:

Input: [1,2,3]       1      / \     2   3Output: 6

Example 2:

Input: [-10,9,20,null,null,15,7]   -10   / \  9  20    /  \   15   7Output: 42

解题思路:题目所要求的最大路径约束条件的是最多只有一个节点的左右节点同时存在于路径中,当然这个节点可以不是根节点。假设其中一个节点a是这样的节点,那么a可以组成的最大路径和就是 max(a.val,a.val+left_child_max_val,a.val+right_child_max_val,a.val+left_child_max_val+right_child_max_val),这里的意思是a本身是最大值、a与左子树组成最大值、a与右子树组成最大值、a与左右子树同时组成最大值。这时a的左右子树的最大值分别是多少呢,以a的左子树为例,根据题目的约束,a已经是唯一一个左右节点同时存在于路径中的节点,那么a的左子树的最大值就只有max(a.left.val,a.left.+left_child_max_val,a.left.+right_child_max_val)三种情况了,即只能自身、和左子树、和右子树组成最大值。遍历整个二叉树,计算出每个节点作为这样一个特殊节点可以组成的最大路径的最大值即可。因为有很多重复的计算,因此可以缓存每个节点的左右子树的最大值以提高效率。

代码如下:

# Definition for a binary tree node.class TreeNode(object):    def __init__(self, x):        self.val = x        self.left = None        self.right = Noneclass Solution(object):    res = -float('inf')    dic_left = {}    dic_right = {}    def getMax(self,node):        if node == None:            return 0        if node in self.dic_left:            lv = self.dic_left[node]        else:            lv = self.getMax(node.left)            self.dic_left[node] = lv        if node in self.dic_right:            rv = self.dic_right[node]        else:            rv = self.getMax(node.right)            self.dic_right[node] = rv        return max(node.val,node.val+lv,node.val+rv)    def recursive(self,node):        if node == None:            return        lv = self.getMax(node.left)        rv = self.getMax(node.right)        self.res = max(self.res, node.val, node.val + lv ,node.val + rv,node.val + lv + rv)        self.recursive(node.left)        self.recursive(node.right)    def maxPathSum(self, root):        """        :type root: TreeNode        :rtype: int        """        self.dic_left = {}        self.dic_right = {}        self.recursive(root)        return self.res

 

转载于:https://www.cnblogs.com/seyjs/p/10555758.html

你可能感兴趣的文章
package.json
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>
计算机基础知识复习
查看>>
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>