LintCode 二叉树中的最大路径和

给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)
样例
给出一棵二叉树:

   1
  / \
 2   3

返回 6

动态规划。
任意节点开始,任意节点结束。
考虑对于任意节点,包含该节点及其子树而构成的路径的最大和有以下几种:

  1. 其左子树的最大路径+右子树的最大路径+其本身(三者均为正数)。
  2. 其左子树的最大路径+其本身(右子树最大路径为负)。
  3. 其右子树的最大路径+其本身(左子树最大路径为负)。
  4. 其本身(左、右子树最大路径均为负)。

而包含某节点及其子树可构成的路径(可被该节点的父节点拿来继续构成路径)则不包括上述四种的第1种。

采用自底向上的方式(后序遍历即可)。每个节点本身的权值用其构成的最大路径(可被该节点的父节点拿来继续构成路径)的值来更新。变量m(存储最大路径值)用上述四种中最大的值来更新。整棵树遍历结束之后,返回m即可。
代码如下:

"""
Definition of TreeNode:
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None
"""
class Solution:
    """
    @param root: The root of binary tree.
    @return: An integer
    """
    def maxPathSum(self, root):
        # write your code here
        m=[0] #存储最大值
        m[0]=-float("Inf")
        def postOrderTraversal(x,m):
            if x!=None:
                postOrderTraversal(x.left,m)
                postOrderTraversal(x.right,m)
                if x.left==None and x.right==None: #叶节点
                    m[0]=max(x.val,m[0])  
                elif x.left==None:   #只有右孩子
                    m[0]=max(x.val,x.val+x.right.val,m[0])
                    x.val=max(x.val,x.val+x.right.val)
                elif x.right==None:  #只有左孩子
                    m[0]=max(x.val,x.val+x.left.val,m[0])
                    x.val=max(x.val,x.val+x.left.val)
                else:  #有左右孩子
                    m[0]=max(x.val,x.val+x.left.val+x.right.val,x.val+x.left.val,\
                    x.val+x.right.val,m[0])
                    x.val=max(x.val,x.val+x.left.val,x.val+x.right.val)
        postOrderTraversal(root,m)
        return m[0]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值