From 92bc9a2fd02bf5a09c816e7fde5c7646e8816f91 Mon Sep 17 00:00:00 2001 From: Kazuki Kitano Date: Tue, 10 Mar 2026 12:13:18 +0900 Subject: [PATCH 1/5] step1 --- memo.md | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ step1-1.py | 24 +++++++++++++++ step1-2.py | 14 +++++++++ step1-3.py | 27 +++++++++++++++++ 4 files changed, 154 insertions(+) create mode 100644 step1-1.py create mode 100644 step1-2.py create mode 100644 step1-3.py diff --git a/memo.md b/memo.md index 4bd0397..94ffbed 100644 --- a/memo.md +++ b/memo.md @@ -1 +1,90 @@ # Step1 + +## アプローチ + +* 最も深い場所を知りたい + * BFSかDFS + * これは全てのノードを訪問する必要があるのでO(N) + + +## Code1-1 (DFS) - solved 3:52 + +```python +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + node = root + frontier = [(node, 1)] + maximum_depth = 0 + while frontier: + node, depth = frontier.pop() + maximum_depth = max(maximum_depth, depth) + if node.left is not None: + frontier.append((node.left, depth + 1)) + if node.right is not None: + frontier.append((node.right, depth + 1)) + + return maximum_depth + +``` + +## Code1-2 (Recursion) - solved 0:46 + +```python +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + left_max_depth = self.maxDepth(root.left) + right_max_depth = self.maxDepth(root.right) + return max(left_max_depth, right_max_depth) + 1 + +``` + +## Code1-3 (BFS) - solved 2:12 + +```python +from collections import deque + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + frontier = deque() + frontier.append(root) + depth = 0 + while frontier: + num_cur_frontiers = len(frontier) + depth += 1 + for _ in range(num_cur_frontiers): + node = frontier.popleft() + if node.left is not None: + frontier.append(node.left) + if node.right is not None: + frontier.append(node.right) + + return depth + +``` \ No newline at end of file diff --git a/step1-1.py b/step1-1.py new file mode 100644 index 0000000..164c2da --- /dev/null +++ b/step1-1.py @@ -0,0 +1,24 @@ +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + node = root + frontier = [(node, 1)] + maximum_depth = 0 + while frontier: + node, depth = frontier.pop() + maximum_depth = max(maximum_depth, depth) + if node.left is not None: + frontier.append((node.left, depth + 1)) + if node.right is not None: + frontier.append((node.right, depth + 1)) + + return maximum_depth + diff --git a/step1-2.py b/step1-2.py new file mode 100644 index 0000000..da41867 --- /dev/null +++ b/step1-2.py @@ -0,0 +1,14 @@ +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + left_max_depth = self.maxDepth(root.left) + right_max_depth = self.maxDepth(root.right) + return max(left_max_depth, right_max_depth) + 1 \ No newline at end of file diff --git a/step1-3.py b/step1-3.py new file mode 100644 index 0000000..2ec272a --- /dev/null +++ b/step1-3.py @@ -0,0 +1,27 @@ +from collections import deque + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + frontier = deque() + frontier.append(root) + depth = 0 + while frontier: + num_cur_frontiers = len(frontier) + depth += 1 + for _ in range(num_cur_frontiers): + node = frontier.popleft() + if node.left is not None: + frontier.append(node.left) + if node.right is not None: + frontier.append(node.right) + + return depth \ No newline at end of file From ae7a8f90e1130c9650f7b107dbcc0e1373f414d7 Mon Sep 17 00:00:00 2001 From: Kazuki Kitano Date: Tue, 10 Mar 2026 14:02:28 +0900 Subject: [PATCH 2/5] step2 --- memo.md | 108 ++++++++++++++++++++++++++++- step1-1.py => step1-1_DFS.py | 0 step1-2.py => step1-2_recursion.py | 0 step1-3.py => step1-3_BFS.py | 0 step2-1_DFS.py | 26 +++++++ step2-2_recursion.py | 15 ++++ step2-3_BFS.py | 29 ++++++++ 7 files changed, 177 insertions(+), 1 deletion(-) rename step1-1.py => step1-1_DFS.py (100%) rename step1-2.py => step1-2_recursion.py (100%) rename step1-3.py => step1-3_BFS.py (100%) create mode 100644 step2-1_DFS.py create mode 100644 step2-2_recursion.py create mode 100644 step2-3_BFS.py diff --git a/memo.md b/memo.md index 94ffbed..d7b739a 100644 --- a/memo.md +++ b/memo.md @@ -87,4 +87,110 @@ class Solution: return depth -``` \ No newline at end of file +``` + +# 他の人のコードや調べたこと + +* 1 - https://github.com/n6o/leetcode_arai60/pull/20/changes + * 思いついた解法3種類全部一緒だった + * 実装もほぼ一緒 +* 2 - https://github.com/TakayaShirai/leetcode_practice/pull/21 + * 同様に解法3種類やっている +* 3 - https://github.com/Hiroto-Iizuka/coding_practice/pull/21 + * Pythonだと再帰に忌避感を持っていた方がいいかも + * > 個人的にはPythonで再帰を書くことにかなり抵抗があるので、iterativeでもこの程度のコード量で済むならiterativeで書きたいと思いました。 +* 4 - https://github.com/xbam326/leetcode/pull/23 +* 5 - https://github.com/dxxsxsxkx/leetcode/pull/21 + + +# Step2 + +## Code2-1 (DFDS) + +```python +from typing import Optional + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + node = root + frontier = [(node, 1)] + maximum_depth = 0 + while frontier: + node, depth = frontier.pop() + if node is None: + continue + maximum_depth = max(maximum_depth, depth) + frontier.append((node.left, depth + 1)) + frontier.append((node.right, depth + 1)) + + return maximum_depth + +``` + +## Code2-2 (Recursion) + +```python +from typing import Optional + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1 + +``` + +## Code2-3(BFS) + +```python +from typing import Optional +from collections import deque + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + frontier = deque() + frontier.append(root) + depth = 0 + while frontier: + num_cur_frontiers = len(frontier) + depth += 1 + for _ in range(num_cur_frontiers): + node = frontier.popleft() + if node is None: + continue + frontier.append(node.left) + frontier.append(node.right) + + return depth + +``` + +# Step3 \ No newline at end of file diff --git a/step1-1.py b/step1-1_DFS.py similarity index 100% rename from step1-1.py rename to step1-1_DFS.py diff --git a/step1-2.py b/step1-2_recursion.py similarity index 100% rename from step1-2.py rename to step1-2_recursion.py diff --git a/step1-3.py b/step1-3_BFS.py similarity index 100% rename from step1-3.py rename to step1-3_BFS.py diff --git a/step2-1_DFS.py b/step2-1_DFS.py new file mode 100644 index 0000000..58ee6c9 --- /dev/null +++ b/step2-1_DFS.py @@ -0,0 +1,26 @@ +from typing import Optional + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + node = root + frontier = [(node, 1)] + maximum_depth = 0 + while frontier: + node, depth = frontier.pop() + if node is None: + continue + maximum_depth = max(maximum_depth, depth) + frontier.append((node.left, depth + 1)) + frontier.append((node.right, depth + 1)) + + return maximum_depth \ No newline at end of file diff --git a/step2-2_recursion.py b/step2-2_recursion.py new file mode 100644 index 0000000..573c0ee --- /dev/null +++ b/step2-2_recursion.py @@ -0,0 +1,15 @@ +from typing import Optional + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1 \ No newline at end of file diff --git a/step2-3_BFS.py b/step2-3_BFS.py new file mode 100644 index 0000000..a4ef50e --- /dev/null +++ b/step2-3_BFS.py @@ -0,0 +1,29 @@ +from typing import Optional +from collections import deque + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + frontier = deque() + frontier.append(root) + depth = 0 + while frontier: + num_cur_frontiers = len(frontier) + depth += 1 + for _ in range(num_cur_frontiers): + node = frontier.popleft() + if node is None: + continue + frontier.append(node.left) + frontier.append(node.right) + + return depth \ No newline at end of file From 1e627cacdcb7fa664052842e3f2d68aaf6a8000a Mon Sep 17 00:00:00 2001 From: Kazuki Kitano Date: Tue, 10 Mar 2026 14:10:24 +0900 Subject: [PATCH 3/5] =?UTF-8?q?step3=201=E5=9B=9E=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- step2-3_BFS.py | 8 ++++---- step3-1_DFS.py | 25 +++++++++++++++++++++++++ step3-2_recursion.py | 15 +++++++++++++++ step3-3_BFS.py | 29 +++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 step3-1_DFS.py create mode 100644 step3-2_recursion.py create mode 100644 step3-3_BFS.py diff --git a/step2-3_BFS.py b/step2-3_BFS.py index a4ef50e..5f94159 100644 --- a/step2-3_BFS.py +++ b/step2-3_BFS.py @@ -21,9 +21,9 @@ def maxDepth(self, root: Optional[TreeNode]) -> int: depth += 1 for _ in range(num_cur_frontiers): node = frontier.popleft() - if node is None: - continue - frontier.append(node.left) - frontier.append(node.right) + if node.left is not None: + frontier.append(node.left) + if node.right is not None: + frontier.append(node.right) return depth \ No newline at end of file diff --git a/step3-1_DFS.py b/step3-1_DFS.py new file mode 100644 index 0000000..78efb9f --- /dev/null +++ b/step3-1_DFS.py @@ -0,0 +1,25 @@ +from typing import Optional + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + maximum_depth = 0 + frontier = [(root, 1)] + while frontier: + node, depth = frontier.pop() + if node is None: + continue + maximum_depth = max(maximum_depth, depth) + frontier.append((node.left, depth + 1)) + frontier.append((node.right, depth + 1)) + + return maximum_depth diff --git a/step3-2_recursion.py b/step3-2_recursion.py new file mode 100644 index 0000000..0466e54 --- /dev/null +++ b/step3-2_recursion.py @@ -0,0 +1,15 @@ +from typing import Optional + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1 \ No newline at end of file diff --git a/step3-3_BFS.py b/step3-3_BFS.py new file mode 100644 index 0000000..4f9d516 --- /dev/null +++ b/step3-3_BFS.py @@ -0,0 +1,29 @@ +from typing import Optional +from collections import deque + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + frontier = deque() + frontier.append(root) + depth = 0 + while frontier: + num_nodes = len(frontier) + depth += 1 + for _ in range(num_nodes): + node = frontier.popleft() + if node.left is not None: + frontier.append(node.left) + if node.right is not None: + frontier.append(node.right) + + return depth \ No newline at end of file From 675f53dd6f5b4cd569f150d458bcd5061c0555ac Mon Sep 17 00:00:00 2001 From: Kazuki Kitano Date: Tue, 10 Mar 2026 14:15:12 +0900 Subject: [PATCH 4/5] =?UTF-8?q?step3=202=E5=9B=9E=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- step3-1_DFS.py | 16 ++++++++-------- step3-2_recursion.py | 2 +- step3-3_BFS.py | 12 ++++++------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/step3-1_DFS.py b/step3-1_DFS.py index 78efb9f..0e7db6a 100644 --- a/step3-1_DFS.py +++ b/step3-1_DFS.py @@ -11,15 +11,15 @@ class Solution: def maxDepth(self, root: Optional[TreeNode]) -> int: if root is None: return 0 - - maximum_depth = 0 + + max_depth = 0 frontier = [(root, 1)] while frontier: node, depth = frontier.pop() - if node is None: - continue - maximum_depth = max(maximum_depth, depth) - frontier.append((node.left, depth + 1)) - frontier.append((node.right, depth + 1)) + max_depth = max(depth, max_depth) + if node.left is not None: + frontier.append((node.left, depth + 1)) + if node.right is not None: + frontier.append((node.right, depth + 1)) - return maximum_depth + return max_depth \ No newline at end of file diff --git a/step3-2_recursion.py b/step3-2_recursion.py index 0466e54..573c0ee 100644 --- a/step3-2_recursion.py +++ b/step3-2_recursion.py @@ -11,5 +11,5 @@ class Solution: def maxDepth(self, root: Optional[TreeNode]) -> int: if root is None: return 0 - + return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1 \ No newline at end of file diff --git a/step3-3_BFS.py b/step3-3_BFS.py index 4f9d516..f588818 100644 --- a/step3-3_BFS.py +++ b/step3-3_BFS.py @@ -11,19 +11,19 @@ def __init__(self, val=0, left=None, right=None): class Solution: def maxDepth(self, root: Optional[TreeNode]) -> int: if root is None: - return 0 - + return 0 + frontier = deque() frontier.append(root) depth = 0 while frontier: - num_nodes = len(frontier) + num_cur_frontiers = len(frontier) depth += 1 - for _ in range(num_nodes): + for _ in range(num_cur_frontiers): node = frontier.popleft() if node.left is not None: frontier.append(node.left) if node.right is not None: frontier.append(node.right) - - return depth \ No newline at end of file + + return depth From 1fe6cb2d44ef575610adbf22588ca64b68355dad Mon Sep 17 00:00:00 2001 From: Kazuki Kitano Date: Tue, 10 Mar 2026 14:20:21 +0900 Subject: [PATCH 5/5] =?UTF-8?q?step3=203=E5=9B=9E=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- step3-1_DFS.py | 7 ++++--- step3-3_BFS.py | 9 ++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/step3-1_DFS.py b/step3-1_DFS.py index 0e7db6a..ad67890 100644 --- a/step3-1_DFS.py +++ b/step3-1_DFS.py @@ -11,9 +11,9 @@ class Solution: def maxDepth(self, root: Optional[TreeNode]) -> int: if root is None: return 0 - - max_depth = 0 + frontier = [(root, 1)] + max_depth = 0 while frontier: node, depth = frontier.pop() max_depth = max(depth, max_depth) @@ -22,4 +22,5 @@ def maxDepth(self, root: Optional[TreeNode]) -> int: if node.right is not None: frontier.append((node.right, depth + 1)) - return max_depth \ No newline at end of file + return max_depth + \ No newline at end of file diff --git a/step3-3_BFS.py b/step3-3_BFS.py index f588818..e9589bd 100644 --- a/step3-3_BFS.py +++ b/step3-3_BFS.py @@ -11,19 +11,18 @@ def __init__(self, val=0, left=None, right=None): class Solution: def maxDepth(self, root: Optional[TreeNode]) -> int: if root is None: - return 0 + return 0 frontier = deque() frontier.append(root) depth = 0 while frontier: - num_cur_frontiers = len(frontier) + num_cur_frontier = len(frontier) depth += 1 - for _ in range(num_cur_frontiers): + for _ in range(num_cur_frontier): node = frontier.popleft() if node.left is not None: frontier.append(node.left) if node.right is not None: frontier.append(node.right) - - return depth + return depth \ No newline at end of file