From ed5b96ba731430d0270ea45008e562dbe96102e7 Mon Sep 17 00:00:00 2001 From: Fiqqar <145265758+Fiqqar@users.noreply.github.com> Date: Sat, 4 Oct 2025 18:45:45 +0700 Subject: [PATCH 01/12] alg [pepeny] new alg binary tree --- height_of_tree/__init__.py | 0 height_of_tree/tree.py | 49 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 height_of_tree/__init__.py create mode 100644 height_of_tree/tree.py diff --git a/height_of_tree/__init__.py b/height_of_tree/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/height_of_tree/tree.py b/height_of_tree/tree.py new file mode 100644 index 000000000000..4c2f97d0678a --- /dev/null +++ b/height_of_tree/tree.py @@ -0,0 +1,49 @@ +class Node: + def __init__(self, info): + self.info = info + self.left = None + self.right = None + + def __str__(self): + return str(self.info) + + +class BinarySearchTree: + def __init__(self): + self.root = None + + def create(self, val): + if self.root == None: + self.root = Node(val) + else: + current = self.root + while True: + if val < current.info: + if current.left: + current = current.left + else: + current.left = Node(val) + break + elif val > current.info: + if current.right: + current = current.right + else: + current.right = Node(val) + break + else: + break + +def height(node): + if node is None: + return -1 + return 1 + max(height(node.left), height(node.right)) + +def tree_height_from_list(data): + bst = BinarySearchTree() + for x in data: + bst.create(x) + return height(bst.root) + +if __name__ == "__main__": + import doctest + doctest.testmod() From 16ad7487cebe2139a09f52a6080b819349ce23e4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 11:50:52 +0000 Subject: [PATCH 02/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- height_of_tree/tree.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/height_of_tree/tree.py b/height_of_tree/tree.py index 4c2f97d0678a..898dcf2e211c 100644 --- a/height_of_tree/tree.py +++ b/height_of_tree/tree.py @@ -1,18 +1,18 @@ class Node: - def __init__(self, info): - self.info = info - self.left = None - self.right = None + def __init__(self, info): + self.info = info + self.left = None + self.right = None def __str__(self): - return str(self.info) + return str(self.info) class BinarySearchTree: - def __init__(self): + def __init__(self): self.root = None - def create(self, val): + def create(self, val): if self.root == None: self.root = Node(val) else: @@ -33,17 +33,21 @@ def create(self, val): else: break + def height(node): if node is None: return -1 return 1 + max(height(node.left), height(node.right)) + def tree_height_from_list(data): bst = BinarySearchTree() for x in data: bst.create(x) return height(bst.root) + if __name__ == "__main__": import doctest + doctest.testmod() From 02b212d407fcaf80769f0988dc46d3e5ba8880f8 Mon Sep 17 00:00:00 2001 From: Wfiq <145265758+Fiqqar@users.noreply.github.com> Date: Sat, 4 Oct 2025 19:00:05 +0700 Subject: [PATCH 03/12] Update tree.py --- height_of_tree/tree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/height_of_tree/tree.py b/height_of_tree/tree.py index 898dcf2e211c..8427f216c515 100644 --- a/height_of_tree/tree.py +++ b/height_of_tree/tree.py @@ -13,7 +13,7 @@ def __init__(self): self.root = None def create(self, val): - if self.root == None: + if self.root is None: self.root = Node(val) else: current = self.root From 16cf4623c1a957c1ff7e5de286e99bd6c6fcaa79 Mon Sep 17 00:00:00 2001 From: Wfiq <145265758+Fiqqar@users.noreply.github.com> Date: Sat, 4 Oct 2025 19:04:03 +0700 Subject: [PATCH 04/12] Update tree.py --- height_of_tree/tree.py | 60 +++++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/height_of_tree/tree.py b/height_of_tree/tree.py index 8427f216c515..700cb8bba50c 100644 --- a/height_of_tree/tree.py +++ b/height_of_tree/tree.py @@ -1,18 +1,32 @@ +from typing import Optional, List + class Node: - def __init__(self, info): - self.info = info - self.left = None - self.right = None + def __init__(self, info: int) -> None: + self.info: int = info + self.left: Optional["Node"] = None + self.right: Optional["Node"] = None - def __str__(self): + def __str__(self) -> str: + """ + >>> str(Node(5)) + '5' + """ return str(self.info) - class BinarySearchTree: - def __init__(self): - self.root = None + def __init__(self) -> None: + self.root: Optional[Node] = None - def create(self, val): + def create(self, val: int) -> None: + """ + >>> bst = BinarySearchTree() + >>> bst.create(10) + >>> bst.root.info + 10 + >>> bst.create(5) + >>> bst.root.left.info + 5 + """ if self.root is None: self.root = Node(val) else: @@ -33,21 +47,37 @@ def create(self, val): else: break - -def height(node): +def height(node: Optional[Node]) -> int: + """ + >>> height(None) + -1 + >>> n = Node(3) + >>> height(n) + 0 + >>> n.left = Node(2) + >>> n.right = Node(5) + >>> n.right.right = Node(6) + >>> height(n) + 2 + """ if node is None: return -1 return 1 + max(height(node.left), height(node.right)) - -def tree_height_from_list(data): +def tree_height_from_list(data: List[int]) -> int: + """ + >>> tree_height_from_list([3,2,5,6]) + 2 + >>> tree_height_from_list([1]) + 0 + >>> tree_height_from_list([5,1,10,15,7]) + 3 + """ bst = BinarySearchTree() for x in data: bst.create(x) return height(bst.root) - if __name__ == "__main__": import doctest - doctest.testmod() From 7770911fc4fcccf53016e79ad9a45b4013930857 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 12:04:22 +0000 Subject: [PATCH 05/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- height_of_tree/tree.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/height_of_tree/tree.py b/height_of_tree/tree.py index 700cb8bba50c..464e65544855 100644 --- a/height_of_tree/tree.py +++ b/height_of_tree/tree.py @@ -1,5 +1,6 @@ from typing import Optional, List + class Node: def __init__(self, info: int) -> None: self.info: int = info @@ -13,6 +14,7 @@ def __str__(self) -> str: """ return str(self.info) + class BinarySearchTree: def __init__(self) -> None: self.root: Optional[Node] = None @@ -47,6 +49,7 @@ def create(self, val: int) -> None: else: break + def height(node: Optional[Node]) -> int: """ >>> height(None) @@ -64,6 +67,7 @@ def height(node: Optional[Node]) -> int: return -1 return 1 + max(height(node.left), height(node.right)) + def tree_height_from_list(data: List[int]) -> int: """ >>> tree_height_from_list([3,2,5,6]) @@ -78,6 +82,8 @@ def tree_height_from_list(data: List[int]) -> int: bst.create(x) return height(bst.root) + if __name__ == "__main__": import doctest + doctest.testmod() From 46642eff5b85e854b9995e8c9de6cf291b29587d Mon Sep 17 00:00:00 2001 From: Wfiq <145265758+Fiqqar@users.noreply.github.com> Date: Sat, 4 Oct 2025 19:20:30 +0700 Subject: [PATCH 06/12] Update tree.py --- height_of_tree/tree.py | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/height_of_tree/tree.py b/height_of_tree/tree.py index 464e65544855..9f11589803db 100644 --- a/height_of_tree/tree.py +++ b/height_of_tree/tree.py @@ -1,11 +1,8 @@ -from typing import Optional, List - - class Node: def __init__(self, info: int) -> None: self.info: int = info - self.left: Optional["Node"] = None - self.right: Optional["Node"] = None + self.left: Node | None = None + self.right: Node | None = None def __str__(self) -> str: """ @@ -14,10 +11,9 @@ def __str__(self) -> str: """ return str(self.info) - class BinarySearchTree: def __init__(self) -> None: - self.root: Optional[Node] = None + self.root: Node | None = None def create(self, val: int) -> None: """ @@ -49,8 +45,7 @@ def create(self, val: int) -> None: else: break - -def height(node: Optional[Node]) -> int: +def height(node: Node | None) -> int: """ >>> height(None) -1 @@ -67,8 +62,7 @@ def height(node: Optional[Node]) -> int: return -1 return 1 + max(height(node.left), height(node.right)) - -def tree_height_from_list(data: List[int]) -> int: +def tree_height_from_list(data: list[int]) -> int: """ >>> tree_height_from_list([3,2,5,6]) 2 @@ -82,8 +76,6 @@ def tree_height_from_list(data: List[int]) -> int: bst.create(x) return height(bst.root) - if __name__ == "__main__": import doctest - doctest.testmod() From 4bac67b4fd0d59341850a6603ea108e16302f6eb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 12:20:49 +0000 Subject: [PATCH 07/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- height_of_tree/tree.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/height_of_tree/tree.py b/height_of_tree/tree.py index 9f11589803db..36141033754c 100644 --- a/height_of_tree/tree.py +++ b/height_of_tree/tree.py @@ -11,6 +11,7 @@ def __str__(self) -> str: """ return str(self.info) + class BinarySearchTree: def __init__(self) -> None: self.root: Node | None = None @@ -45,6 +46,7 @@ def create(self, val: int) -> None: else: break + def height(node: Node | None) -> int: """ >>> height(None) @@ -62,6 +64,7 @@ def height(node: Node | None) -> int: return -1 return 1 + max(height(node.left), height(node.right)) + def tree_height_from_list(data: list[int]) -> int: """ >>> tree_height_from_list([3,2,5,6]) @@ -76,6 +79,8 @@ def tree_height_from_list(data: list[int]) -> int: bst.create(x) return height(bst.root) + if __name__ == "__main__": import doctest + doctest.testmod() From 16dfa686bd14b467d78fc3f8a5335f05a6b50c5d Mon Sep 17 00:00:00 2001 From: Wfiq <145265758+Fiqqar@users.noreply.github.com> Date: Sat, 4 Oct 2025 19:30:46 +0700 Subject: [PATCH 08/12] Update tree.py --- height_of_tree/tree.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/height_of_tree/tree.py b/height_of_tree/tree.py index 36141033754c..7f714f267efa 100644 --- a/height_of_tree/tree.py +++ b/height_of_tree/tree.py @@ -74,10 +74,24 @@ def tree_height_from_list(data: list[int]) -> int: >>> tree_height_from_list([5,1,10,15,7]) 3 """ - bst = BinarySearchTree() - for x in data: - bst.create(x) - return height(bst.root) + if not data: + return -1 + nodes = [Node(val) for val in data] + q = [nodes[0]] + i = 1 + front = 0 + while i < len(nodes): + curr = q[front] + front += 1 + if i < len(nodes): + curr.left = nodes[i] + q.append(curr.left) + i += 1 + if i < len(nodes): + curr.right = nodes[i] + q.append(curr.right) + i += 1 + return height(nodes[0]) if __name__ == "__main__": From 653741d2e562c3f316d58909dd36e122aceffbc5 Mon Sep 17 00:00:00 2001 From: Wfiq <145265758+Fiqqar@users.noreply.github.com> Date: Sat, 4 Oct 2025 19:33:56 +0700 Subject: [PATCH 09/12] Update tree.py --- height_of_tree/tree.py | 75 ++++++++---------------------------------- 1 file changed, 14 insertions(+), 61 deletions(-) diff --git a/height_of_tree/tree.py b/height_of_tree/tree.py index 7f714f267efa..8427f216c515 100644 --- a/height_of_tree/tree.py +++ b/height_of_tree/tree.py @@ -1,31 +1,18 @@ class Node: - def __init__(self, info: int) -> None: - self.info: int = info - self.left: Node | None = None - self.right: Node | None = None + def __init__(self, info): + self.info = info + self.left = None + self.right = None - def __str__(self) -> str: - """ - >>> str(Node(5)) - '5' - """ + def __str__(self): return str(self.info) class BinarySearchTree: - def __init__(self) -> None: - self.root: Node | None = None + def __init__(self): + self.root = None - def create(self, val: int) -> None: - """ - >>> bst = BinarySearchTree() - >>> bst.create(10) - >>> bst.root.info - 10 - >>> bst.create(5) - >>> bst.root.left.info - 5 - """ + def create(self, val): if self.root is None: self.root = Node(val) else: @@ -47,51 +34,17 @@ def create(self, val: int) -> None: break -def height(node: Node | None) -> int: - """ - >>> height(None) - -1 - >>> n = Node(3) - >>> height(n) - 0 - >>> n.left = Node(2) - >>> n.right = Node(5) - >>> n.right.right = Node(6) - >>> height(n) - 2 - """ +def height(node): if node is None: return -1 return 1 + max(height(node.left), height(node.right)) -def tree_height_from_list(data: list[int]) -> int: - """ - >>> tree_height_from_list([3,2,5,6]) - 2 - >>> tree_height_from_list([1]) - 0 - >>> tree_height_from_list([5,1,10,15,7]) - 3 - """ - if not data: - return -1 - nodes = [Node(val) for val in data] - q = [nodes[0]] - i = 1 - front = 0 - while i < len(nodes): - curr = q[front] - front += 1 - if i < len(nodes): - curr.left = nodes[i] - q.append(curr.left) - i += 1 - if i < len(nodes): - curr.right = nodes[i] - q.append(curr.right) - i += 1 - return height(nodes[0]) +def tree_height_from_list(data): + bst = BinarySearchTree() + for x in data: + bst.create(x) + return height(bst.root) if __name__ == "__main__": From c478bf4c6bfbf60461188dfdbf5d5f318779d516 Mon Sep 17 00:00:00 2001 From: Wfiq <145265758+Fiqqar@users.noreply.github.com> Date: Sat, 4 Oct 2025 19:40:39 +0700 Subject: [PATCH 10/12] Update tree.py --- height_of_tree/tree.py | 54 +++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/height_of_tree/tree.py b/height_of_tree/tree.py index 8427f216c515..3398953db50c 100644 --- a/height_of_tree/tree.py +++ b/height_of_tree/tree.py @@ -1,18 +1,30 @@ class Node: - def __init__(self, info): + def __init__(self, info: int) -> None: self.info = info - self.left = None - self.right = None + self.left: 'Node|None' = None + self.right: 'Node|None' = None - def __str__(self): + def __str__(self) -> str: + """ + >>> str(Node(5)) + '5' + """ return str(self.info) - class BinarySearchTree: - def __init__(self): - self.root = None + def __init__(self) -> None: + self.root: 'Node|None' = None - def create(self, val): + def create(self, val: int) -> None: + """ + >>> bst = BinarySearchTree() + >>> bst.create(10) + >>> bst.root.info + 10 + >>> bst.create(5) + >>> bst.root.left.info + 5 + """ if self.root is None: self.root = Node(val) else: @@ -33,21 +45,35 @@ def create(self, val): else: break - -def height(node): +def height(node: 'Node|None') -> int: + """ + >>> height(None) + -1 + >>> n = Node(3) + >>> height(n) + 0 + >>> n.left = Node(2) + >>> n.right = Node(5) + >>> n.right.right = Node(6) + >>> height(n) + 2 + """ if node is None: return -1 return 1 + max(height(node.left), height(node.right)) - -def tree_height_from_list(data): +def tree_height_from_list(data: list[int]) -> int: + """ + >>> tree_height_from_list([3,2,5,6]) + 2 + >>> tree_height_from_list([1]) + 0 + """ bst = BinarySearchTree() for x in data: bst.create(x) return height(bst.root) - if __name__ == "__main__": import doctest - doctest.testmod() From d12637c49598c6cb65b0d60ed2103c2c4a869686 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 12:40:58 +0000 Subject: [PATCH 11/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- height_of_tree/tree.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/height_of_tree/tree.py b/height_of_tree/tree.py index 3398953db50c..59afe31f9bc2 100644 --- a/height_of_tree/tree.py +++ b/height_of_tree/tree.py @@ -1,8 +1,8 @@ class Node: def __init__(self, info: int) -> None: self.info = info - self.left: 'Node|None' = None - self.right: 'Node|None' = None + self.left: "Node|None" = None + self.right: "Node|None" = None def __str__(self) -> str: """ @@ -11,9 +11,10 @@ def __str__(self) -> str: """ return str(self.info) + class BinarySearchTree: def __init__(self) -> None: - self.root: 'Node|None' = None + self.root: "Node|None" = None def create(self, val: int) -> None: """ @@ -45,7 +46,8 @@ def create(self, val: int) -> None: else: break -def height(node: 'Node|None') -> int: + +def height(node: "Node|None") -> int: """ >>> height(None) -1 @@ -62,6 +64,7 @@ def height(node: 'Node|None') -> int: return -1 return 1 + max(height(node.left), height(node.right)) + def tree_height_from_list(data: list[int]) -> int: """ >>> tree_height_from_list([3,2,5,6]) @@ -74,6 +77,8 @@ def tree_height_from_list(data: list[int]) -> int: bst.create(x) return height(bst.root) + if __name__ == "__main__": import doctest + doctest.testmod() From 7ae4eecd9b22e13f4ea2187698734e4c2007b5b1 Mon Sep 17 00:00:00 2001 From: Wfiq <145265758+Fiqqar@users.noreply.github.com> Date: Sat, 4 Oct 2025 19:43:05 +0700 Subject: [PATCH 12/12] Update tree.py --- height_of_tree/tree.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/height_of_tree/tree.py b/height_of_tree/tree.py index 59afe31f9bc2..d87806b7d2d4 100644 --- a/height_of_tree/tree.py +++ b/height_of_tree/tree.py @@ -1,8 +1,8 @@ class Node: def __init__(self, info: int) -> None: self.info = info - self.left: "Node|None" = None - self.right: "Node|None" = None + self.left: Node | None = None + self.right: Node | None = None def __str__(self) -> str: """ @@ -14,7 +14,7 @@ def __str__(self) -> str: class BinarySearchTree: def __init__(self) -> None: - self.root: "Node|None" = None + self.root: Node | None = None def create(self, val: int) -> None: """ @@ -47,7 +47,7 @@ def create(self, val: int) -> None: break -def height(node: "Node|None") -> int: +def height(node: Node | None) -> int: """ >>> height(None) -1