From 9c90ab7de052b1bdfcadf1ab8ab3d08613800276 Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 01:56:28 +0530 Subject: [PATCH 01/23] symmectric tree --- data_structures/binary_tree/symmetric_tree.py | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 data_structures/binary_tree/symmetric_tree.py diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py new file mode 100644 index 000000000000..044adb7da8a6 --- /dev/null +++ b/data_structures/binary_tree/symmetric_tree.py @@ -0,0 +1,91 @@ +""" +Given the root of a binary tree, check whether it is a mirror of itself +(i.e., symmetric around its center). + +Leetcode reference: https://leetcode.com/problems/symmetric-tree/ +""" +class Node: + """ + A Node has data variable and pointers to Nodes to its left and right. + """ + + def __init__(self, data: int) -> None: + self.data = data + self.left: Node | None = None + self.right: Node | None = None + +def is_symmetric_tree(tree: Node) -> bool: + """ + Test cases for is_symmetric_tree function. + + The below tree looks like this + 1 + / \ + 2 2 + / \ / \ + 3 4 4 3 + + >>> tree = Node(1) + >>> tree.left = Node(2) + >>> tree.right = Node(2) + >>> tree.left.left = Node(3) + >>> tree.left.right = Node(4) + >>> tree.right.left = Node(4) + >>> tree.right.right = Node(3) + + >>> is_symmetric_tree(tree) + True + + The below tree looks like this + 1 + / \ + 2 2 + / \ / \ + 3 4 3 4 + + >>> tree2 = Node(1) + >>> tree2.left = Node(2) + >>> tree2.right = Node(2) + >>> tree2.left.left = Node(3) + >>> tree2.left.right = Node(4) + >>> tree2.right.left = Node(3) + >>> tree2.right.right = Node(4) + + >>> is_symmetric_tree(tree2) + False + """ + if tree is None: + # An empty tree is considered symmetric. + return True + return is_mirror(tree.left,tree.right) + +def is_mirror(left,right): + if left is None and right is None: + # Both sides are empty, which is symmetric. + return True + if left is None or right is None: + # One side is empty while the other is not, which is not symmetric. + return False + if left.data == right.data: + # The values match, so check the subtree + return is_mirror(left.left, right.right) and is_mirror(left.right, right.left) + return False + +def main() -> None: + # Create a symmetric tree for testing. + tree = Node(1) + tree.left = Node(2) + tree.right = Node(2) + tree.left.left = Node(3) + tree.left.right = Node(4) + tree.right.left = Node(4) + tree.right.right = Node(3) + + print(is_symmetric_tree(tree)) + +if __name__ == "__main__": + main() + + from doctest import testmod + + testmod() From f6b261eea9ae7e303f360ac79f1054de0344f848 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 20:28:48 +0000 Subject: [PATCH 02/23] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/binary_tree/symmetric_tree.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index 044adb7da8a6..ffb7e7803527 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -1,9 +1,11 @@ """ -Given the root of a binary tree, check whether it is a mirror of itself +Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center). Leetcode reference: https://leetcode.com/problems/symmetric-tree/ """ + + class Node: """ A Node has data variable and pointers to Nodes to its left and right. @@ -14,6 +16,7 @@ def __init__(self, data: int) -> None: self.left: Node | None = None self.right: Node | None = None + def is_symmetric_tree(tree: Node) -> bool: """ Test cases for is_symmetric_tree function. @@ -24,7 +27,7 @@ def is_symmetric_tree(tree: Node) -> bool: 2 2 / \ / \ 3 4 4 3 - + >>> tree = Node(1) >>> tree.left = Node(2) >>> tree.right = Node(2) @@ -57,9 +60,10 @@ def is_symmetric_tree(tree: Node) -> bool: if tree is None: # An empty tree is considered symmetric. return True - return is_mirror(tree.left,tree.right) + return is_mirror(tree.left, tree.right) -def is_mirror(left,right): + +def is_mirror(left, right): if left is None and right is None: # Both sides are empty, which is symmetric. return True @@ -71,6 +75,7 @@ def is_mirror(left,right): return is_mirror(left.left, right.right) and is_mirror(left.right, right.left) return False + def main() -> None: # Create a symmetric tree for testing. tree = Node(1) @@ -83,6 +88,7 @@ def main() -> None: print(is_symmetric_tree(tree)) + if __name__ == "__main__": main() From fa422541ffc72a9e2e3d2c15c6ade484ccdf1b07 Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 02:02:20 +0530 Subject: [PATCH 03/23] removed trailing spaces --- data_structures/binary_tree/symmetric_tree.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index 044adb7da8a6..4181bfa29e91 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -1,5 +1,5 @@ """ -Given the root of a binary tree, check whether it is a mirror of itself +Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center). Leetcode reference: https://leetcode.com/problems/symmetric-tree/ @@ -19,12 +19,12 @@ def is_symmetric_tree(tree: Node) -> bool: Test cases for is_symmetric_tree function. The below tree looks like this - 1 - / \ - 2 2 - / \ / \ - 3 4 4 3 - + 1 + / \ + 2 2 + / \ / \ + 3 4 4 3 + >>> tree = Node(1) >>> tree.left = Node(2) >>> tree.right = Node(2) From f7ea89c60d72ad766878d4fef4da7e439e9adb72 Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 02:06:14 +0530 Subject: [PATCH 04/23] escape sequence fix --- data_structures/binary_tree/symmetric_tree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index b00b9e09b21a..f43fe27e4b3f 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -18,7 +18,7 @@ def __init__(self, data: int) -> None: def is_symmetric_tree(tree: Node) -> bool: - """ + r""" Test cases for is_symmetric_tree function. The below tree looks like this From 6cd5628f7e01815b9843d49140a818d6a39f7333 Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 02:15:40 +0530 Subject: [PATCH 05/23] added return type --- data_structures/binary_tree/symmetric_tree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index f43fe27e4b3f..126b43ca779b 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -63,7 +63,7 @@ def is_symmetric_tree(tree: Node) -> bool: return is_mirror(tree.left, tree.right) -def is_mirror(left, right): +def is_mirror(left, right) -> bool: if left is None and right is None: # Both sides are empty, which is symmetric. return True From 7c8afa66ecd7a7766f3ee545591daa5a5813dc5f Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 02:29:31 +0530 Subject: [PATCH 06/23] added class --- data_structures/binary_tree/symmetric_tree.py | 130 ++++++++---------- 1 file changed, 58 insertions(+), 72 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index 126b43ca779b..710ce1f95eae 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -16,82 +16,68 @@ def __init__(self, data: int) -> None: self.left: Node | None = None self.right: Node | None = None - -def is_symmetric_tree(tree: Node) -> bool: - r""" - Test cases for is_symmetric_tree function. - - The below tree looks like this - 1 - / \ - 2 2 - / \ / \ - 3 4 4 3 - - >>> tree = Node(1) - >>> tree.left = Node(2) - >>> tree.right = Node(2) - >>> tree.left.left = Node(3) - >>> tree.left.right = Node(4) - >>> tree.right.left = Node(4) - >>> tree.right.right = Node(3) - - >>> is_symmetric_tree(tree) - True - - The below tree looks like this - 1 - / \ - 2 2 - / \ / \ - 3 4 3 4 - - >>> tree2 = Node(1) - >>> tree2.left = Node(2) - >>> tree2.right = Node(2) - >>> tree2.left.left = Node(3) - >>> tree2.left.right = Node(4) - >>> tree2.right.left = Node(3) - >>> tree2.right.right = Node(4) - - >>> is_symmetric_tree(tree2) - False - """ - if tree is None: - # An empty tree is considered symmetric. - return True - return is_mirror(tree.left, tree.right) - - -def is_mirror(left, right) -> bool: - if left is None and right is None: - # Both sides are empty, which is symmetric. - return True - if left is None or right is None: - # One side is empty while the other is not, which is not symmetric. +class SymmetricTree: + def is_symmetric_tree(self,tree: Node) -> bool: + r""" + Test cases for is_symmetric_tree function. + + The below tree looks like this + 1 + / \ + 2 2 + / \ / \ + 3 4 4 3 + + >>> tree = Node(1) + >>> tree.left = Node(2) + >>> tree.right = Node(2) + >>> tree.left.left = Node(3) + >>> tree.left.right = Node(4) + >>> tree.right.left = Node(4) + >>> tree.right.right = Node(3) + + >>> SymmetricTree().is_symmetric_tree(tree) + True + + The below tree looks like this + 1 + / \ + 2 2 + / \ / \ + 3 4 3 4 + + >>> tree2 = Node(1) + >>> tree2.left = Node(2) + >>> tree2.right = Node(2) + >>> tree2.left.left = Node(3) + >>> tree2.left.right = Node(4) + >>> tree2.right.left = Node(3) + >>> tree2.right.right = Node(4) + + >>> SymmetricTree().is_symmetric_tree(tree2) + False + """ + if tree is None: + # An empty tree is considered symmetric. + return True + return self.is_mirror(tree.left, tree.right) + + + def is_mirror(self,left, right) -> bool: + + if left is None and right is None: + # Both sides are empty, which is symmetric. + return True + if left is None or right is None: + # One side is empty while the other is not, which is not symmetric. + return False + if left.data == right.data: + # The values match, so check the subtree + return self.is_mirror(left.left, right.right) and self.is_mirror(left.right, right.left) return False - if left.data == right.data: - # The values match, so check the subtree - return is_mirror(left.left, right.right) and is_mirror(left.right, right.left) - return False - - -def main() -> None: - # Create a symmetric tree for testing. - tree = Node(1) - tree.left = Node(2) - tree.right = Node(2) - tree.left.left = Node(3) - tree.left.right = Node(4) - tree.right.left = Node(4) - tree.right.right = Node(3) - - print(is_symmetric_tree(tree)) if __name__ == "__main__": - main() - from doctest import testmod testmod() From 4d16aeba8c5275c77672e930aa9afd83c0fa7e89 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 21:00:13 +0000 Subject: [PATCH 07/23] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/binary_tree/symmetric_tree.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index 710ce1f95eae..9b7d36d9c737 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -16,8 +16,9 @@ def __init__(self, data: int) -> None: self.left: Node | None = None self.right: Node | None = None + class SymmetricTree: - def is_symmetric_tree(self,tree: Node) -> bool: + def is_symmetric_tree(self, tree: Node) -> bool: r""" Test cases for is_symmetric_tree function. @@ -62,9 +63,7 @@ def is_symmetric_tree(self,tree: Node) -> bool: return True return self.is_mirror(tree.left, tree.right) - - def is_mirror(self,left, right) -> bool: - + def is_mirror(self, left, right) -> bool: if left is None and right is None: # Both sides are empty, which is symmetric. return True @@ -73,7 +72,9 @@ def is_mirror(self,left, right) -> bool: return False if left.data == right.data: # The values match, so check the subtree - return self.is_mirror(left.left, right.right) and self.is_mirror(left.right, right.left) + return self.is_mirror(left.left, right.right) and self.is_mirror( + left.right, right.left + ) return False From e305ae33ad769b711b2d5bd4cb511ede52e683cb Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 02:33:04 +0530 Subject: [PATCH 08/23] wordings fix --- data_structures/binary_tree/symmetric_tree.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index 710ce1f95eae..c9ef676a11e3 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -73,7 +73,8 @@ def is_mirror(self,left, right) -> bool: return False if left.data == right.data: # The values match, so check the subtree - return self.is_mirror(left.left, right.right) and self.is_mirror(left.right, right.left) + return self.is_mirror(left.left, right.right) \ + and self.is_mirror(left.right, right.left) return False From 1964155926da778491283fbb367595e1d18b85ad Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 21:05:29 +0000 Subject: [PATCH 09/23] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/binary_tree/symmetric_tree.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index ab5f1715596e..9b7d36d9c737 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -72,8 +72,9 @@ def is_mirror(self, left, right) -> bool: return False if left.data == right.data: # The values match, so check the subtree - return self.is_mirror(left.left, right.right) \ - and self.is_mirror(left.right, right.left) + return self.is_mirror(left.left, right.right) and self.is_mirror( + left.right, right.left + ) return False From 621959ddf72df13f70160f2b1d648e9038b08f21 Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 02:38:47 +0530 Subject: [PATCH 10/23] added static method --- data_structures/binary_tree/symmetric_tree.py | 1 + 1 file changed, 1 insertion(+) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index ab5f1715596e..6ed04ace69c3 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -63,6 +63,7 @@ def is_symmetric_tree(self, tree: Node) -> bool: return True return self.is_mirror(tree.left, tree.right) + @staticmethod def is_mirror(self, left, right) -> bool: if left is None and right is None: # Both sides are empty, which is symmetric. From 44d843a4dd48759d05e04db3fe070a7b3dabd969 Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 02:40:59 +0530 Subject: [PATCH 11/23] added type --- data_structures/binary_tree/symmetric_tree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index 9fac4a25ac2b..17d3d4ea2828 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -64,7 +64,7 @@ def is_symmetric_tree(self, tree: Node) -> bool: return self.is_mirror(tree.left, tree.right) @staticmethod - def is_mirror(self, left, right) -> bool: + def is_mirror(self, left: Node, right: Node) -> bool: if left is None and right is None: # Both sides are empty, which is symmetric. return True From 0b4c1f28ef8c23159e8a1c0a0977f97263835f3b Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 02:51:23 +0530 Subject: [PATCH 12/23] added static method --- data_structures/binary_tree/symmetric_tree.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index 17d3d4ea2828..ec0a9a00cc08 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -64,7 +64,7 @@ def is_symmetric_tree(self, tree: Node) -> bool: return self.is_mirror(tree.left, tree.right) @staticmethod - def is_mirror(self, left: Node, right: Node) -> bool: + def is_mirror(left: Node | None, right: Node | None) -> bool: if left is None and right is None: # Both sides are empty, which is symmetric. return True @@ -73,7 +73,7 @@ def is_mirror(self, left: Node, right: Node) -> bool: return False if left.data == right.data: # The values match, so check the subtree - return self.is_mirror(left.left, right.right) and self.is_mirror( + return SymmetricTree.is_mirror(left.left, right.right) and SymmetricTree.is_mirror( left.right, right.left ) return False From 4dafe7e31125f1abdcce435f525e8290c37669f7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 21:22:02 +0000 Subject: [PATCH 13/23] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/binary_tree/symmetric_tree.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index ec0a9a00cc08..cf2727aa3500 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -73,9 +73,9 @@ def is_mirror(left: Node | None, right: Node | None) -> bool: return False if left.data == right.data: # The values match, so check the subtree - return SymmetricTree.is_mirror(left.left, right.right) and SymmetricTree.is_mirror( - left.right, right.left - ) + return SymmetricTree.is_mirror( + left.left, right.right + ) and SymmetricTree.is_mirror(left.right, right.left) return False From 222cd708a8d654cade1d6fdaafa9e7694eae400a Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 02:52:50 +0530 Subject: [PATCH 14/23] wordings fix --- data_structures/binary_tree/symmetric_tree.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index ec0a9a00cc08..5ba845036c2f 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -73,9 +73,8 @@ def is_mirror(left: Node | None, right: Node | None) -> bool: return False if left.data == right.data: # The values match, so check the subtree - return SymmetricTree.is_mirror(left.left, right.right) and SymmetricTree.is_mirror( - left.right, right.left - ) + return SymmetricTree.is_mirror(left.left, right.right) \ + and SymmetricTree.is_mirror(left.right, right.left) return False From cf24dce3c0f64cd4459928537603f82d5695ffd5 Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 03:16:04 +0530 Subject: [PATCH 15/23] testcase added --- data_structures/binary_tree/symmetric_tree.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index cf2727aa3500..c750dc47ecc1 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -63,8 +63,17 @@ def is_symmetric_tree(self, tree: Node) -> bool: return True return self.is_mirror(tree.left, tree.right) - @staticmethod - def is_mirror(left: Node | None, right: Node | None) -> bool: + def is_mirror(self, left: Node | None, right:Node | Node) -> bool: + """ + Check if two binary trees are mirrors of each other. + + Args: + left (Node | None): The root of the left subtree. + right (Node | None): The root of the right subtree. + + Returns: + bool: True if the two trees are mirrors, False otherwise. + """ if left is None and right is None: # Both sides are empty, which is symmetric. return True @@ -73,9 +82,8 @@ def is_mirror(left: Node | None, right: Node | None) -> bool: return False if left.data == right.data: # The values match, so check the subtree - return SymmetricTree.is_mirror( - left.left, right.right - ) and SymmetricTree.is_mirror(left.right, right.left) + return self.is_mirror(left.left, right.right) \ + and self.is_mirror(left.right, right.left) return False From f98f199ace760eea19312dcb4c576ca7f5e78688 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 21:46:40 +0000 Subject: [PATCH 16/23] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/binary_tree/symmetric_tree.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index c750dc47ecc1..1f807878b7cc 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -63,7 +63,7 @@ def is_symmetric_tree(self, tree: Node) -> bool: return True return self.is_mirror(tree.left, tree.right) - def is_mirror(self, left: Node | None, right:Node | Node) -> bool: + def is_mirror(self, left: Node | None, right: Node | Node) -> bool: """ Check if two binary trees are mirrors of each other. @@ -82,8 +82,9 @@ def is_mirror(self, left: Node | None, right:Node | Node) -> bool: return False if left.data == right.data: # The values match, so check the subtree - return self.is_mirror(left.left, right.right) \ - and self.is_mirror(left.right, right.left) + return self.is_mirror(left.left, right.right) and self.is_mirror( + left.right, right.left + ) return False From 1229d85f6d754c431b865fd216ce810a2f4bdccc Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 03:21:03 +0530 Subject: [PATCH 17/23] testcase added for mirror function --- data_structures/binary_tree/symmetric_tree.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index c750dc47ecc1..49539c7983df 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -65,14 +65,15 @@ def is_symmetric_tree(self, tree: Node) -> bool: def is_mirror(self, left: Node | None, right:Node | Node) -> bool: """ - Check if two binary trees are mirrors of each other. - - Args: - left (Node | None): The root of the left subtree. - right (Node | None): The root of the right subtree. - - Returns: - bool: True if the two trees are mirrors, False otherwise. + >>> tree1 = Node(1) + >>> tree1.left = Node(2) + >>> tree1.right = Node(2) + >>> tree1.left.left = Node(3) + >>> tree1.left.right = Node(4) + >>> tree1.right.left = Node(4) + >>> tree1.right.right = Node(3) + >>> SymmetricTree().is_mirror(tree1.left, tree1.right) + True """ if left is None and right is None: # Both sides are empty, which is symmetric. From 6bfe7c78721725c84f108614beb19859621a7268 Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 03:23:06 +0530 Subject: [PATCH 18/23] testcase added for mirror function --- data_structures/binary_tree/symmetric_tree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index 22bb91b9cf3f..a8985cf11037 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -63,7 +63,7 @@ def is_symmetric_tree(self, tree: Node) -> bool: return True return self.is_mirror(tree.left, tree.right) - def is_mirror(self, left: Node | None, right: Node | Node) -> bool: + def is_mirror(self, left: Node | None, right: Node | None) -> bool: """ >>> tree1 = Node(1) >>> tree1.left = Node(2) From 6d53919ac0581a01e04b194c61f69d29ea3a8c2c Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 04:54:42 +0530 Subject: [PATCH 19/23] made the requested changes --- data_structures/binary_tree/symmetric_tree.py | 96 ++++++++++--------- 1 file changed, 51 insertions(+), 45 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index a8985cf11037..d396e749ab9e 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -4,58 +4,65 @@ Leetcode reference: https://leetcode.com/problems/symmetric-tree/ """ +from __future__ import annotations +from dataclasses import dataclass - +@dataclass class Node: """ A Node has data variable and pointers to Nodes to its left and right. """ + data: int + left: Node | None = None + right: Node | None = None - def __init__(self, data: int) -> None: - self.data = data - self.left: Node | None = None - self.right: Node | None = None - - -class SymmetricTree: - def is_symmetric_tree(self, tree: Node) -> bool: +def make_symmetric_tree() -> Node: r""" - Test cases for is_symmetric_tree function. - - The below tree looks like this + Create a symmetric tree for testing. + The tree looks like this: + 1 + / \ + 2 2 + / \ / \ + 3 4 4 3 + """ + tree = Node(1) + tree.left = Node(2) + tree.right = Node(2) + tree.left.left = Node(3) + tree.left.right = Node(4) + tree.right.left = Node(4) + tree.right.right = Node(3) + return tree + +def make_asymmetric_tree() -> Node: + r""" + Create a asymmetric tree for testing. + The tree looks like this: 1 / \ - 2 2 - / \ / \ - 3 4 4 3 + 2 2 + / \ / \ + 3 4 3 4 + """ + tree = Node(1) + tree.left = Node(2) + tree.right = Node(2) + tree.left.left = Node(3) + tree.left.right = Node(4) + tree.right.left = Node(3) + tree.right.right = Node(4) + return tree - >>> tree = Node(1) - >>> tree.left = Node(2) - >>> tree.right = Node(2) - >>> tree.left.left = Node(3) - >>> tree.left.right = Node(4) - >>> tree.right.left = Node(4) - >>> tree.right.right = Node(3) +class SymmetricTree: + def is_symmetric_tree(self, tree: Node) -> bool: + r""" + Test cases for is_symmetric_tree function - >>> SymmetricTree().is_symmetric_tree(tree) + >>> SymmetricTree().is_symmetric_tree(make_symmetric_tree()) True - The below tree looks like this - 1 - / \ - 2 2 - / \ / \ - 3 4 3 4 - - >>> tree2 = Node(1) - >>> tree2.left = Node(2) - >>> tree2.right = Node(2) - >>> tree2.left.left = Node(3) - >>> tree2.left.right = Node(4) - >>> tree2.right.left = Node(3) - >>> tree2.right.right = Node(4) - - >>> SymmetricTree().is_symmetric_tree(tree2) + >>> SymmetricTree().is_symmetric_tree(make_asymmetric_tree()) False """ if tree is None: @@ -65,15 +72,14 @@ def is_symmetric_tree(self, tree: Node) -> bool: def is_mirror(self, left: Node | None, right: Node | None) -> bool: """ - >>> tree1 = Node(1) - >>> tree1.left = Node(2) - >>> tree1.right = Node(2) - >>> tree1.left.left = Node(3) - >>> tree1.left.right = Node(4) - >>> tree1.right.left = Node(4) + >>> tree1 = make_symmetric_tree() >>> tree1.right.right = Node(3) >>> SymmetricTree().is_mirror(tree1.left, tree1.right) True + + >>> tree2 = make_asymmetric_tree() + >>> SymmetricTree().is_mirror(tree2.left, tree2.right) + False """ if left is None and right is None: # Both sides are empty, which is symmetric. From 9bd84a95f34e5e1dc95b79026644c366325ec81b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 23:25:31 +0000 Subject: [PATCH 20/23] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/binary_tree/symmetric_tree.py | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index d396e749ab9e..d5e18fe7b2d0 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -7,17 +7,20 @@ from __future__ import annotations from dataclasses import dataclass + @dataclass class Node: """ A Node has data variable and pointers to Nodes to its left and right. """ + data: int left: Node | None = None right: Node | None = None + def make_symmetric_tree() -> Node: - r""" + r""" Create a symmetric tree for testing. The tree looks like this: 1 @@ -26,17 +29,18 @@ def make_symmetric_tree() -> Node: / \ / \ 3 4 4 3 """ - tree = Node(1) - tree.left = Node(2) - tree.right = Node(2) - tree.left.left = Node(3) - tree.left.right = Node(4) - tree.right.left = Node(4) - tree.right.right = Node(3) - return tree + tree = Node(1) + tree.left = Node(2) + tree.right = Node(2) + tree.left.left = Node(3) + tree.left.right = Node(4) + tree.right.left = Node(4) + tree.right.right = Node(3) + return tree + def make_asymmetric_tree() -> Node: - r""" + r""" Create a asymmetric tree for testing. The tree looks like this: 1 @@ -45,19 +49,20 @@ def make_asymmetric_tree() -> Node: / \ / \ 3 4 3 4 """ - tree = Node(1) - tree.left = Node(2) - tree.right = Node(2) - tree.left.left = Node(3) - tree.left.right = Node(4) - tree.right.left = Node(3) - tree.right.right = Node(4) - return tree + tree = Node(1) + tree.left = Node(2) + tree.right = Node(2) + tree.left.left = Node(3) + tree.left.right = Node(4) + tree.right.left = Node(3) + tree.right.right = Node(4) + return tree + class SymmetricTree: def is_symmetric_tree(self, tree: Node) -> bool: r""" - Test cases for is_symmetric_tree function + Test cases for is_symmetric_tree function >>> SymmetricTree().is_symmetric_tree(make_symmetric_tree()) True From 1d43d8c4d36237bad6665c4783cf09d80b7219a7 Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 04:59:41 +0530 Subject: [PATCH 21/23] made the requested changes --- data_structures/binary_tree/symmetric_tree.py | 1 + 1 file changed, 1 insertion(+) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index d396e749ab9e..872d0040c74f 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -5,6 +5,7 @@ Leetcode reference: https://leetcode.com/problems/symmetric-tree/ """ from __future__ import annotations + from dataclasses import dataclass @dataclass From 4fa0769b4785807d2bc1eb1d4586bf5657fb37c1 Mon Sep 17 00:00:00 2001 From: "jeevaramanthan.m" Date: Fri, 6 Oct 2023 05:15:17 +0530 Subject: [PATCH 22/23] doc test added for symmetric, asymmetric --- data_structures/binary_tree/symmetric_tree.py | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index 2abfa6a5a2df..b80e491b073e 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -29,7 +29,23 @@ def make_symmetric_tree() -> Node: 2 2 / \ / \ 3 4 4 3 - """ + + >>> tree = make_symmetric_tree() + >>> tree.data + 1 + >>> tree.left.data + 2 + >>> tree.right.data + 2 + >>> tree.left.left.data + 3 + >>> tree.left.right.data + 4 + >>> tree.right.left.data + 4 + >>> tree.right.right.data + 3 + """ tree = Node(1) tree.left = Node(2) tree.right = Node(2) @@ -49,7 +65,24 @@ def make_asymmetric_tree() -> Node: 2 2 / \ / \ 3 4 3 4 - """ + + >>> tree = make_asymmetric_tree() + >>> tree.data + 1 + >>> tree.left.data + 2 + >>> tree.right.data + 2 + >>> tree.left.left.data + 3 + >>> tree.left.right.data + 4 + >>> tree.right.left.data + 3 + >>> tree.right.right.data + 4 + """ + tree = Node(1) tree.left = Node(2) tree.right = Node(2) From 62b4a80dda70e5b2b7b883cbaf2fa9d61b36f966 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Fri, 6 Oct 2023 01:56:50 +0200 Subject: [PATCH 23/23] Update symmetric_tree.py --- data_structures/binary_tree/symmetric_tree.py | 165 +++++++----------- 1 file changed, 63 insertions(+), 102 deletions(-) diff --git a/data_structures/binary_tree/symmetric_tree.py b/data_structures/binary_tree/symmetric_tree.py index b80e491b073e..331a25849c1c 100644 --- a/data_structures/binary_tree/symmetric_tree.py +++ b/data_structures/binary_tree/symmetric_tree.py @@ -22,116 +22,77 @@ class Node: def make_symmetric_tree() -> Node: r""" - Create a symmetric tree for testing. - The tree looks like this: - 1 - / \ - 2 2 - / \ / \ - 3 4 4 3 - - >>> tree = make_symmetric_tree() - >>> tree.data - 1 - >>> tree.left.data - 2 - >>> tree.right.data - 2 - >>> tree.left.left.data - 3 - >>> tree.left.right.data - 4 - >>> tree.right.left.data - 4 - >>> tree.right.right.data - 3 + Create a symmetric tree for testing. + The tree looks like this: + 1 + / \ + 2 2 + / \ / \ + 3 4 4 3 """ - tree = Node(1) - tree.left = Node(2) - tree.right = Node(2) - tree.left.left = Node(3) - tree.left.right = Node(4) - tree.right.left = Node(4) - tree.right.right = Node(3) - return tree + root = Node(1) + root.left = Node(2) + root.right = Node(2) + root.left.left = Node(3) + root.left.right = Node(4) + root.right.left = Node(4) + root.right.right = Node(3) + return root def make_asymmetric_tree() -> Node: r""" - Create a asymmetric tree for testing. - The tree looks like this: - 1 - / \ - 2 2 - / \ / \ - 3 4 3 4 - - >>> tree = make_asymmetric_tree() - >>> tree.data - 1 - >>> tree.left.data - 2 - >>> tree.right.data - 2 - >>> tree.left.left.data - 3 - >>> tree.left.right.data - 4 - >>> tree.right.left.data - 3 - >>> tree.right.right.data - 4 + Create a asymmetric tree for testing. + The tree looks like this: + 1 + / \ + 2 2 + / \ / \ + 3 4 3 4 """ + root = Node(1) + root.left = Node(2) + root.right = Node(2) + root.left.left = Node(3) + root.left.right = Node(4) + root.right.left = Node(3) + root.right.right = Node(4) + return root - tree = Node(1) - tree.left = Node(2) - tree.right = Node(2) - tree.left.left = Node(3) - tree.left.right = Node(4) - tree.right.left = Node(3) - tree.right.right = Node(4) - return tree - - -class SymmetricTree: - def is_symmetric_tree(self, tree: Node) -> bool: - r""" - Test cases for is_symmetric_tree function - - >>> SymmetricTree().is_symmetric_tree(make_symmetric_tree()) - True - - >>> SymmetricTree().is_symmetric_tree(make_asymmetric_tree()) - False - """ - if tree is None: - # An empty tree is considered symmetric. - return True - return self.is_mirror(tree.left, tree.right) - - def is_mirror(self, left: Node | None, right: Node | None) -> bool: - """ - >>> tree1 = make_symmetric_tree() - >>> tree1.right.right = Node(3) - >>> SymmetricTree().is_mirror(tree1.left, tree1.right) - True - - >>> tree2 = make_asymmetric_tree() - >>> SymmetricTree().is_mirror(tree2.left, tree2.right) - False - """ - if left is None and right is None: - # Both sides are empty, which is symmetric. - return True - if left is None or right is None: - # One side is empty while the other is not, which is not symmetric. - return False - if left.data == right.data: - # The values match, so check the subtree - return self.is_mirror(left.left, right.right) and self.is_mirror( - left.right, right.left - ) + +def is_symmetric_tree(tree: Node) -> bool: + """ + Test cases for is_symmetric_tree function + >>> is_symmetric_tree(make_symmetric_tree()) + True + >>> is_symmetric_tree(make_asymmetric_tree()) + False + """ + if tree: + return is_mirror(tree.left, tree.right) + return True # An empty tree is considered symmetric. + + +def is_mirror(left: Node | None, right: Node | None) -> bool: + """ + >>> tree1 = make_symmetric_tree() + >>> tree1.right.right = Node(3) + >>> is_mirror(tree1.left, tree1.right) + True + >>> tree2 = make_asymmetric_tree() + >>> is_mirror(tree2.left, tree2.right) + False + """ + if left is None and right is None: + # Both sides are empty, which is symmetric. + return True + if left is None or right is None: + # One side is empty while the other is not, which is not symmetric. return False + if left.data == right.data: + # The values match, so check the subtree + return is_mirror(left.left, right.right) and is_mirror(left.right, right.left) + return False if __name__ == "__main__":