给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
思路
- 对每一个节点都计算出:有穿过它但不穿过它父节点的最大路径和
- 整体最大路径和: 1中所有计算结果的最大值
时间复杂度和空间复杂度都是O(n)
///1个节点能提供给父节点的最大路径值
func value(_ node: TreeNode?) -> Int {
guard let node = node else {
return 0
}
let leftValue = max(value(node.left), 0)
let rightValue = max(value(node.right), 0)
return node.val + max(leftValue, rightValue)
}
最大路径和
@discardableResult class func value(_ node: TreeNode? ,_ maxSum: inout Int) -> Int {
guard let node = node else {
return 0
}
let leftValue = max(value(node.left, &maxSum), 0)
let rightValue = max(value(node.right, &maxSum), 0)
maxSum = max(maxSum, node.val + leftValue + rightValue)
return node.val + max(leftValue, rightValue)
}
class func maxPathSum(_ root: TreeNode?) -> Int {
var maxSum = Int.min
value(root, &maxSum)
return maxSum
}