document.write('
本题可以通过对二叉树进行后序遍历来解决,具体思路如下:
 对于当前遍历到的结点root,假设已经求出在遍历root结点前最大的路径和为max:
 (1)求出以root.left为起始结点,叶子结点为终结点的最大路径和为maxLeft;
 (2)同理求出以root.right为起始结点,叶子结点为终结点的最大路径和maxRight。
 包含root结点的最长路径可能包含如下三种情况:
 (1)leftMax=root.val+maxLeft(左子树最大路径和可能为负)。
 (2)rightMax=root.val+maxRight(右子树最大路径和可能为负)。
 (3)allMax=root.val+maxLeft+maxRight(左右子树的最大路径和都不为负)。
 因此,包含root结点的最大路径和为tmpMax=max(leftMax,rightMax,allMax)。
 在求出包含root结点的最大路径后,如果tmpMax>max,那么更新最大路径和为tmpMax。
 实现代码如下:
 class TreeNode:
 def __init__(self,val):
 self.val=val
 self.left=None
 self.right=None
 
 class IntRef:
 def __init__(self):
 self.val=None
 
 #求a,b,c的最大值
 def Max(a,b,c):
 maxs=a if a>b else b
 maxs=maxs if maxs>c else C
 return maxs
 
 #寻找最长路径
 def findMaxPathRecursive(root,maxs):
 if None==root:
 return 0
 else:
 #求左子树以root.left为起始结点的最大路径和
 sumLeft=findMaxPathRecursive(root.left,maxs)
 #求右子树以root.right为起始结点的最大路径和
 sumRight=findMaxPathRecursive(root.right,maxs)
 #求以root为起始结点, 叶子结点为结束结点的最大路径和
 allMax=root.val+sumLeft+sumRight
 leftMax=root.val+sumLeft
 rightMax=root.val+sumRight
 tmpMax=Max(allMax, leftMax, rightMax)
 if tmpMax>maxs.val:
 maxs.val=tmpMax
 subMax=sumLeft if sumLeft>sumRight else sumRight
 #返回以root为起始结点, 叶子结点为结束结点的最大路径和
 return root.val+subMax
 
 def findMaxPath(root):
 maxs=IntRef()
 maxs.val=-2**31
 findMaxPathRecursive(root,maxs)
 return maxs.val
 
 if __name__=="__main__":
 root=TreeNode(2)
 left=TreeNode(3)
 right=TreeNode(5)
 root.left=left
 root.right=right
 print findMaxPath(root)
 程序的运行结果为
 10
 算法性能分析:
 二叉树后序遍历的时间复杂度为O(N),因此,这种方法的时间复杂度也为O(N)。

 

');