From 59760a8cf616a460466816ef6bb3621e17f6eb5c Mon Sep 17 00:00:00 2001 From: CaedenPH Date: Sat, 15 Oct 2022 23:56:20 +0100 Subject: [PATCH 1/2] feat: Implement binary tree path sum (#7135) --- .../binary_tree/binary_tree_path_sum.py | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 data_structures/binary_tree/binary_tree_path_sum.py diff --git a/data_structures/binary_tree/binary_tree_path_sum.py b/data_structures/binary_tree/binary_tree_path_sum.py new file mode 100644 index 000000000000..5a9a155d76b3 --- /dev/null +++ b/data_structures/binary_tree/binary_tree_path_sum.py @@ -0,0 +1,88 @@ +""" +Given the root of a binary tree and an integer target, +find the number of paths where the sum of the values +along the path equals target. + + +Leetcode reference: https://leetcode.com/problems/path-sum-iii/ +""" + +from __future__ import annotations + + +class Node: + """ + A Node has value variable and pointers to Nodes to its left and right. + """ + + def __init__(self, value: int) -> None: + self.value = value + self.left: Node | None = None + self.right: Node | None = None + + +class BinaryTreePathSum: + r""" + The below tree looks like this + 10 + / \ + 5 -3 + / \ \ + 3 2 11 + / \ \ + 3 -2 1 + + + >>> tree = Node(10) + >>> tree.left = Node(5) + >>> tree.right = Node(-3) + >>> tree.left.left = Node(3) + >>> tree.left.right = Node(2) + >>> tree.right.right = Node(11) + >>> tree.left.left.left = Node(3) + >>> tree.left.left.right = Node(-2) + >>> tree.left.right.right = Node(1) + + >>> BinaryTreePathSum().path_sum(tree, 8) + 3 + >>> BinaryTreePathSum().path_sum(tree, 7) + 2 + >>> tree.right.right = Node(10) + >>> BinaryTreePathSum().path_sum(tree, 8) + 2 + """ + + target: int + + def __init__(self) -> None: + self.paths = 0 + + def dfs(self, node: Node | None, path_sum: int) -> None: + if node is None: + return + + if path_sum == self.target: + self.paths += 1 + + if node.left: + self.dfs(node.left, path_sum + node.left.value) + if node.right: + self.dfs(node.right, path_sum + node.right.value) + + def path_sum(self, node: Node | None, target: int | None = None) -> int: + if node is None: + return 0 + if target is not None: + self.target = target + + self.dfs(node, node.value) + self.path_sum(node.left) + self.path_sum(node.right) + + return self.paths + + +if __name__ == "__main__": + import doctest + + doctest.testmod() From 7ca71ce484f36ac08ae6a862862982ec05bf71c9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 15 Oct 2022 22:57:57 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/binary_tree/binary_tree_path_sum.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data_structures/binary_tree/binary_tree_path_sum.py b/data_structures/binary_tree/binary_tree_path_sum.py index 5a9a155d76b3..b8bc7379bb12 100644 --- a/data_structures/binary_tree/binary_tree_path_sum.py +++ b/data_structures/binary_tree/binary_tree_path_sum.py @@ -1,5 +1,5 @@ """ -Given the root of a binary tree and an integer target, +Given the root of a binary tree and an integer target, find the number of paths where the sum of the values along the path equals target. @@ -31,7 +31,7 @@ class BinaryTreePathSum: 3 2 11 / \ \ 3 -2 1 - + >>> tree = Node(10) >>> tree.left = Node(5) @@ -68,7 +68,7 @@ def dfs(self, node: Node | None, path_sum: int) -> None: self.dfs(node.left, path_sum + node.left.value) if node.right: self.dfs(node.right, path_sum + node.right.value) - + def path_sum(self, node: Node | None, target: int | None = None) -> int: if node is None: return 0 @@ -80,7 +80,7 @@ def path_sum(self, node: Node | None, target: int | None = None) -> int: self.path_sum(node.right) return self.paths - + if __name__ == "__main__": import doctest