124. 二叉树中的最大路径和

410 阅读1分钟

leetcode原题链接

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

思路

  1. 对每一个节点都计算出:有穿过它但不穿过它父节点的最大路径和
  2. 整体最大路径和: 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
    }