这道题是很普通的一道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