给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)
样例
给出一棵二叉树:
1
/ \
2 3
返回 6
动态规划。
任意节点开始,任意节点结束。
考虑对于任意节点,包含该节点及其子树而构成的路径的最大和有以下几种:
- 其左子树的最大路径+右子树的最大路径+其本身(三者均为正数)。
- 其左子树的最大路径+其本身(右子树最大路径为负)。
- 其右子树的最大路径+其本身(左子树最大路径为负)。
- 其本身(左、右子树最大路径均为负)。
而包含某节点及其子树可构成的路径(可被该节点的父节点拿来继续构成路径)则不包括上述四种的第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]