diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a1e9bd4..107c326 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,8 +1,8 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.12.7 + rev: v0.15.2 hooks: - - id: ruff + - id: ruff-check args: [--fix] - repo: https://github.com/psf/black diff --git a/src/binary_tree/dfs/leaf_similar_trees/__init__.py b/src/binary_tree/dfs/leaf_similar_trees/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/binary_tree/dfs/leaf_similar_trees/solution.py b/src/binary_tree/dfs/leaf_similar_trees/solution.py new file mode 100644 index 0000000..b96268d --- /dev/null +++ b/src/binary_tree/dfs/leaf_similar_trees/solution.py @@ -0,0 +1,21 @@ +from structures import TreeNode +from itertools import zip_longest +from typing import Optional + + +class Solution: + def get_leaves(self, root: TreeNode) -> list: + if root: + if not root.left and not root.right: + yield [root.val] + yield from self.get_leaves(root.right) + yield from self.get_leaves(root.left) + + def leafSimilar(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> bool: + sentinel = object() + return all( + a == b + for a, b in zip_longest( + self.get_leaves(root1), self.get_leaves(root2), fillvalue=sentinel + ) + ) diff --git a/tests/test_leaf_similar_trees.py b/tests/test_leaf_similar_trees.py new file mode 100644 index 0000000..3bc95bf --- /dev/null +++ b/tests/test_leaf_similar_trees.py @@ -0,0 +1,21 @@ +import pytest +from src.binary_tree.dfs.leaf_similar_trees.solution import Solution +from test_utils import TreeBuilder + + +@pytest.mark.parametrize( + "root1, root2, expected", + [ + ( + [3, 5, 1, 6, 2, 9, 8, None, None, 7, 4], + [3, 5, 1, 6, 7, 4, 2, None, None, None, None, None, None, 9, 8], + True, + ), + ([1, 2, 3], [1, 3, 2], False), + ], +) +def test_leaf_similar(root1: list, root2: list, expected: bool): + root1 = TreeBuilder.from_list(root1) + root2 = TreeBuilder.from_list(root2) + solution = Solution() + assert solution.leafSimilar(root1, root2) == expected