diff --git a/grind75_hard/10_124_Binary Tree Maximum Path Sum/level_1.py b/grind75_hard/10_124_Binary Tree Maximum Path Sum/level_1.py new file mode 100644 index 0000000..a56d704 --- /dev/null +++ b/grind75_hard/10_124_Binary Tree Maximum Path Sum/level_1.py @@ -0,0 +1,19 @@ +# DFSを使う +# 子を2つ持てるのは根だけ +class Solution: + def maxPathSum(self, root: Optional[TreeNode]) -> int: + max_sum = -float("inf") + + def helper(node): + nonlocal max_sum + if not node: + return 0 + left_sum = helper(node.left) + right_sum = helper(node.right) + one_child_val = max(node.val + left_sum, node.val + right_sum) + two_child_val = node.val + left_sum + right_sum + max_sum = max(max_sum, node.val, one_child_val, two_child_val) + return max(node.val, one_child_val) + + helper(root) + return max_sum diff --git a/grind75_hard/10_124_Binary Tree Maximum Path Sum/level_2.py b/grind75_hard/10_124_Binary Tree Maximum Path Sum/level_2.py new file mode 100644 index 0000000..72704fd --- /dev/null +++ b/grind75_hard/10_124_Binary Tree Maximum Path Sum/level_2.py @@ -0,0 +1,20 @@ +# 子ノードが負の場合は、その子ノードを選ばない(0にする)ように修正 +# root.valを初期値にしておく +# 一応rootがNoneの場合は0を返すようにする +class Solution: + def maxPathSum(self, root: Optional[TreeNode]) -> int: + if not root: + return 0 + max_sum = root.val + + def helper(node): + nonlocal max_sum + if not node: + return 0 + left_sum = max(0, helper(node.left)) + right_sum = max(0, helper(node.right)) + max_sum = max(max_sum, node.val + left_sum + right_sum) + return node.val + max(left_sum, right_sum) + + helper(root) + return max_sum diff --git a/grind75_hard/10_124_Binary Tree Maximum Path Sum/level_3.py b/grind75_hard/10_124_Binary Tree Maximum Path Sum/level_3.py new file mode 100644 index 0000000..ee11bef --- /dev/null +++ b/grind75_hard/10_124_Binary Tree Maximum Path Sum/level_3.py @@ -0,0 +1,16 @@ + +class Solution: + def maxPathSum(self, root: Optional[TreeNode]) -> int: + max_sum = root.val + + def helper(node): + nonlocal max_sum + if not node: + return 0 + left_sum = max(0, helper(node.left)) + right_sum = max(0, helper(node.right)) + max_sum = max(max_sum, node.val + left_sum + right_sum) + return max(node.val + left_sum, node.val + right_sum) + + helper(root) + return max_sum diff --git a/grind75_hard/10_124_Binary Tree Maximum Path Sum/level_4.py b/grind75_hard/10_124_Binary Tree Maximum Path Sum/level_4.py new file mode 100644 index 0000000..43feedd --- /dev/null +++ b/grind75_hard/10_124_Binary Tree Maximum Path Sum/level_4.py @@ -0,0 +1,15 @@ +# 最大値を引数で渡すように修正 +class Solution: + def maxPathSum(self, root: Optional[TreeNode]) -> int: + + def helper(node, max_sum): + if not node: + return 0, max_sum + left_sum, max_sum = helper(node.left, max_sum) + right_sum, max_sum = helper(node.right, max_sum) + max_sum = max(max_sum, node.val + left_sum + right_sum) + max_one_child = node.val + max(left_sum, right_sum) + return max(0, max_one_child), max_sum + + _, max_sum = helper(root, root.val) + return max_sum