LintCode 二叉树中的最大路径和

来源:互联网 发布:ubuntu vnc客户端启动 编辑:程序博客网 时间:2024/05/21 17:56

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

   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]
原创粉丝点击