leetcode专题训练124. Binary Tree Maximum Path Sum

这道题是很普通的一道DFS,思路大概就是深度优先遍历树中所有节点,返回以当前节点开始的最长的单边路径的长度,而由于路径可以是左子树连到根连到右子树,所以最长的路径为max(root.val, root.val+max(maxLeft, maxRight))。然而我居然WA了两次,第一次是因为调用函数时调用错了,第二次是因为忽略了左右边的最长路径都可能为负值的情况,切记切记。到时候笔试的时候可不会提示错误用例。

写法一:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    # 返回以当前节点开始的最长的单个路径的长度
    # 同时更新以当前节点为最上节点的最长路径长度
    def DFS(self, root: TreeNode) -> int:

        maxLeft=maxRight=0
        if root.left is not None:
            maxLeft = self.DFS(root.left)
        if root.right is not None:
            maxRight = self.DFS(root.right)
        
        nowLen = root.val
        if maxLeft > 0:
            nowLen += maxLeft
        if maxRight > 0:
            nowLen += maxRight

        self.maxLen = max(self.maxLen, nowLen)

        result = max(root.val, root.val+max(maxLeft, maxRight))
        return result

    def maxPathSum(self, root: TreeNode) -> int:
        if root is None:
            return 0
        
        self.maxLen = root.val
        self.DFS(root)
        return self.maxLen

写法二:
看了题解,发现题解思路和我是一样的,就是代码更加简洁了,所以更改了以上代码。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    # 返回以当前节点开始的最长的单个路径的长度
    # 同时更新以当前节点为最上节点的最长路径长度
    def DFS(self, root: TreeNode) -> int:
        if root is None:
            return 0

        maxLeft = max(0, self.DFS(root.left))
        maxRight = max(0, self.DFS(root.right))
        
        nowLen = root.val+maxLeft+maxRight

        self.maxLen = max(self.maxLen, nowLen)

        return root.val+max(maxLeft, maxRight)

    def maxPathSum(self, root: TreeNode) -> int:
        if root is None:
            return 0
        
        self.maxLen = root.val
        self.DFS(root)
        return self.maxLen
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值