二叉树的直径,二叉树中的最大路径和
这两道题比较类似,可以拿出来分析下相同点。
二叉树的直径
Code
# 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 diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:## 针对root节点,直径可能是 左→root→右;也可能是左→root→上 / 右→root→上self.max_value = float('-inf')def postordersearch(root):if not root:return 0left_height = postordersearch(root.left)right_height = postordersearch(root.right)cur_root = max(left_height, right_height) + 1 ### 从左/右到root的最大长度 左→root/右→rootself.max_value = max(self.max_value, left_height + right_height) ### 记录每个节点下 其左子树经过root到右子树的路径长度return cur_rootpostordersearch(root)return self.max_value二叉树中的最大路径和
Code
# 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 maxPathSum(self, root: Optional[TreeNode]) -> int:### 与求二叉树的直径思路差不多,前者是求最长的路径;这里是求最大的路径和def get_path(root):### 后序遍历,每个节点存储其从下到上到当前节点时的路径最大和if not root: ### 空节点没有值return 0left_sum, right_sum = 0, 0left_sum = get_path(root.left)right_sum = get_path(root.right)root_val = max(left_sum, right_sum, 0) + root.val ### 如果是负值的话则丢弃那些树枝,负数只会越加越小self.max_value = max(self.max_value, root_val, left_sum + root.val + right_sum) ## root_val表示不经过根节点,只有左→中/右→中## left_sum + root.val + right_sum 表示经过根节点,是左→中→右的情况return root_valself.max_value = float('-inf')get_path(root)return self.max_value
