From 71d5345c49b3459fce5f49d9e298d9b33f9ca1ee Mon Sep 17 00:00:00 2001 From: Kazuki Kitano Date: Thu, 19 Mar 2026 11:30:36 +0900 Subject: [PATCH 1/5] step2 --- memo.md | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/memo.md b/memo.md index 4bd0397..a04f7ab 100644 --- a/memo.md +++ b/memo.md @@ -1 +1,121 @@ # Step1 + +## アプローチ (14:22) + +* rootとなる値がわかれば, それより左側と右側で再帰を呼ぶことで解ける + * rootとなる値は中央値? + * height-balancedではある + * rootの左側と右側の個数が等しくなるようにすればbalancedにはなるよな +* 日本語で仕事を考えてみる + * 与えられた数字の列からrootになる値を決める(自分の仕事) + * 決めた数字の左側と右側の配列を部下に渡して, 自分が繋ぐべきrootをもらう + * rootを返す +* 計算量を考える + * 計算量をT(N)とする + * T(N) = T(N/2) + T(N/2) = T(N / 2^2) + ... + T(N / 2^2) + * T(N) = T(1) * 2 * 2^(log2_N) + * O(N) + * 追記: slicingを使っていた場合はO(NlogN)になる +* 空間計算量 + * 再帰の最大回数 ... logN + * 結果として使う分 ... size(TreeNode) * N + * O(N) + +## Code1-1 (Recursion) - 1:49 + +```python +from typing import List, Optional + + +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + if not nums: + return None + if len(nums) == 1: + return TreeNode(nums[0]) + + mid_idx = len(nums) // 2 + root_node = TreeNode(nums[mid_idx]) + left_nums = nums[:mid_idx] + right_nums = nums[mid_idx + 1:] + root_node.left = self.sortedArrayToBST(left_nums) + root_node.right = self.sortedArrayToBST(right_nums) + return root_node + +``` + +# Step2 + +## 他の人のコード + +* https://github.com/mamo3gr/arai60/pull/23/files + * whileを使用した再帰 + * 区間を指定した再帰関数を作った実装もある + +## Code2-1 (Recursion) + +```python +from typing import List, Optional + + +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + def sortedArrayToBST_with_range(nums, left, right): + if left > right: + return None + if left == right: + return TreeNode(nums[left]) + + mid_idx = (left + right) // 2 + return TreeNode( + val=nums[mid_idx], + left=sortedArrayToBST_with_range(nums, left, mid_idx - 1), + right=sortedArrayToBST_with_range(nums, mid_idx + 1, right) + ) + + return sortedArrayToBST_with_range(nums, 0, len(nums) - 1) + + +``` + +## Code2-2 (DFS) + +```python +from typing import List, Optional + + +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + root = TreeNode() + frontier = [(0, len(nums) - 1, root)] + while frontier: + left, right, node = frontier.pop() + mid = (left + right) // 2 + node.val = nums[mid] + if left <= mid - 1: + node.left = TreeNode() + frontier.append((left, mid - 1, node.left)) + if mid + 1 <= right: + node.right = TreeNode() + frontier.append((mid + 1, right, node.right)) + return root + +``` \ No newline at end of file From 53210142ea09ff0c4198101583ec5aacd2607127 Mon Sep 17 00:00:00 2001 From: Kazuki Kitano Date: Thu, 19 Mar 2026 11:37:10 +0900 Subject: [PATCH 2/5] step3 1st --- step1-1_recursion.py | 23 +++++++++++++++++++++++ step2-1_recursion.py | 25 +++++++++++++++++++++++++ step2-2_dfs.py | 24 ++++++++++++++++++++++++ step3-1_recursion.py | 26 ++++++++++++++++++++++++++ step3-2_dfs.py | 23 +++++++++++++++++++++++ 5 files changed, 121 insertions(+) create mode 100644 step1-1_recursion.py create mode 100644 step2-1_recursion.py create mode 100644 step2-2_dfs.py create mode 100644 step3-1_recursion.py create mode 100644 step3-2_dfs.py diff --git a/step1-1_recursion.py b/step1-1_recursion.py new file mode 100644 index 0000000..fe47b40 --- /dev/null +++ b/step1-1_recursion.py @@ -0,0 +1,23 @@ +from typing import List, Optional + + +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + if not nums: + return None + if len(nums) == 1: + return TreeNode(nums[0]) + + mid_idx = len(nums) // 2 + root_node = TreeNode(nums[mid_idx]) + left_nums = nums[:mid_idx] + right_nums = nums[mid_idx + 1:] + root_node.left = self.sortedArrayToBST(left_nums) + root_node.right = self.sortedArrayToBST(right_nums) + return root_node \ No newline at end of file diff --git a/step2-1_recursion.py b/step2-1_recursion.py new file mode 100644 index 0000000..45ce03d --- /dev/null +++ b/step2-1_recursion.py @@ -0,0 +1,25 @@ +from typing import List, Optional + + +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + def sortedArrayToBST_with_range(nums, left, right): + if left > right: + return None + if left == right: + return TreeNode(nums[left]) + + mid_idx = (left + right) // 2 + return TreeNode( + val=nums[mid_idx], + left=sortedArrayToBST_with_range(nums, left, mid_idx - 1), + right=sortedArrayToBST_with_range(nums, mid_idx + 1, right) + ) + + return sortedArrayToBST_with_range(nums, 0, len(nums) - 1) diff --git a/step2-2_dfs.py b/step2-2_dfs.py new file mode 100644 index 0000000..e395735 --- /dev/null +++ b/step2-2_dfs.py @@ -0,0 +1,24 @@ +from typing import List, Optional + + +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + root = TreeNode() + frontier = [(0, len(nums) - 1, root)] + while frontier: + left, right, node = frontier.pop() + mid = (left + right) // 2 + node.val = nums[mid] + if left <= mid - 1: + node.left = TreeNode() + frontier.append((left, mid - 1, node.left)) + if mid + 1 <= right: + node.right = TreeNode() + frontier.append((mid + 1, right, node.right)) + return root \ No newline at end of file diff --git a/step3-1_recursion.py b/step3-1_recursion.py new file mode 100644 index 0000000..b34ccf8 --- /dev/null +++ b/step3-1_recursion.py @@ -0,0 +1,26 @@ +# 1st: 1:41 + + +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def sortedArrayToBST(self, nums: list[int]) -> TreeNode | None: + def sortedArrayToBST_with_range(nums, left, right): + if left > right: + return None + if left == right: + return TreeNode(nums[left]) + + mid_idx = (left + right) // 2 + return TreeNode( + val=nums[mid_idx], + left=sortedArrayToBST_with_range(nums, left, mid_idx - 1), + right=sortedArrayToBST_with_range(nums, mid_idx + 1, right) + ) + + return sortedArrayToBST_with_range(nums, 0, len(nums) - 1) + \ No newline at end of file diff --git a/step3-2_dfs.py b/step3-2_dfs.py new file mode 100644 index 0000000..19bf81c --- /dev/null +++ b/step3-2_dfs.py @@ -0,0 +1,23 @@ +# 1st: 1:55 + +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def sortedArrayToBST(self, nums: list[int]) -> TreeNode | None: + root = TreeNode() + frontier = [(0, len(nums) - 1, root)] + while frontier: + left, right, node = frontier.pop() + mid = (left + right) // 2 + node.val = nums[mid] + if left <= mid - 1: + node.left = TreeNode() + frontier.append((left, mid - 1, node.left)) + if mid + 1 <= right: + node.right = TreeNode() + frontier.append((mid + 1, right, node.right)) + return root \ No newline at end of file From 9a27b4573ecad104b2ca157466d1ba15881a234b Mon Sep 17 00:00:00 2001 From: Kazuki Kitano Date: Thu, 19 Mar 2026 11:40:53 +0900 Subject: [PATCH 3/5] step3 2nd --- step3-1_recursion.py | 14 +++++++------- step3-2_dfs.py | 4 +++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/step3-1_recursion.py b/step3-1_recursion.py index b34ccf8..850cca4 100644 --- a/step3-1_recursion.py +++ b/step3-1_recursion.py @@ -1,4 +1,5 @@ # 1st: 1:41 +# 1st: 1:19 # Definition for a binary tree node. @@ -15,12 +16,11 @@ def sortedArrayToBST_with_range(nums, left, right): if left == right: return TreeNode(nums[left]) - mid_idx = (left + right) // 2 + mid = (left + right) // 2 return TreeNode( - val=nums[mid_idx], - left=sortedArrayToBST_with_range(nums, left, mid_idx - 1), - right=sortedArrayToBST_with_range(nums, mid_idx + 1, right) + val=nums[mid], + left=sortedArrayToBST_with_range(nums, left, mid - 1), + right=sortedArrayToBST_with_range(nums, mid + 1, right) ) - - return sortedArrayToBST_with_range(nums, 0, len(nums) - 1) - \ No newline at end of file + + return sortedArrayToBST_with_range(nums, 0, len(nums) - 1) \ No newline at end of file diff --git a/step3-2_dfs.py b/step3-2_dfs.py index 19bf81c..2d19993 100644 --- a/step3-2_dfs.py +++ b/step3-2_dfs.py @@ -1,4 +1,5 @@ # 1st: 1:55 +# 1st: 1:41 # Definition for a binary tree node. # class TreeNode: @@ -20,4 +21,5 @@ def sortedArrayToBST(self, nums: list[int]) -> TreeNode | None: if mid + 1 <= right: node.right = TreeNode() frontier.append((mid + 1, right, node.right)) - return root \ No newline at end of file + return root + \ No newline at end of file From 88b2e5361f55498fe531524d818191ea51ff8626 Mon Sep 17 00:00:00 2001 From: Kazuki Kitano Date: Thu, 19 Mar 2026 11:44:58 +0900 Subject: [PATCH 4/5] step3 3rd --- step3-1_recursion.py | 2 +- step3-2_dfs.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/step3-1_recursion.py b/step3-1_recursion.py index 850cca4..af25814 100644 --- a/step3-1_recursion.py +++ b/step3-1_recursion.py @@ -1,5 +1,6 @@ # 1st: 1:41 # 1st: 1:19 +# 1st: 1:12 # Definition for a binary tree node. @@ -22,5 +23,4 @@ def sortedArrayToBST_with_range(nums, left, right): left=sortedArrayToBST_with_range(nums, left, mid - 1), right=sortedArrayToBST_with_range(nums, mid + 1, right) ) - return sortedArrayToBST_with_range(nums, 0, len(nums) - 1) \ No newline at end of file diff --git a/step3-2_dfs.py b/step3-2_dfs.py index 2d19993..43513ad 100644 --- a/step3-2_dfs.py +++ b/step3-2_dfs.py @@ -1,5 +1,6 @@ # 1st: 1:55 # 1st: 1:41 +# 1st: 1:25 # Definition for a binary tree node. # class TreeNode: @@ -21,5 +22,5 @@ def sortedArrayToBST(self, nums: list[int]) -> TreeNode | None: if mid + 1 <= right: node.right = TreeNode() frontier.append((mid + 1, right, node.right)) - return root - \ No newline at end of file + + return root \ No newline at end of file From 2850e61872137932bc396eea55a444637da053f2 Mon Sep 17 00:00:00 2001 From: Kazuki Kitano Date: Thu, 19 Mar 2026 11:45:54 +0900 Subject: [PATCH 5/5] step3 memo --- memo.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/memo.md b/memo.md index a04f7ab..7db2646 100644 --- a/memo.md +++ b/memo.md @@ -118,4 +118,70 @@ class Solution: frontier.append((mid + 1, right, node.right)) return root +``` + +# Step3 + +## Code3-1 (Recursion) + +```python +# 1st: 1:41 +# 1st: 1:19 +# 1st: 1:12 + + +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def sortedArrayToBST(self, nums: list[int]) -> TreeNode | None: + def sortedArrayToBST_with_range(nums, left, right): + if left > right: + return None + if left == right: + return TreeNode(nums[left]) + + mid = (left + right) // 2 + return TreeNode( + val=nums[mid], + left=sortedArrayToBST_with_range(nums, left, mid - 1), + right=sortedArrayToBST_with_range(nums, mid + 1, right) + ) + return sortedArrayToBST_with_range(nums, 0, len(nums) - 1) + +``` + +## Code3-2 (DFS) + +```python +# 1st: 1:55 +# 1st: 1:41 +# 1st: 1:25 + +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def sortedArrayToBST(self, nums: list[int]) -> TreeNode | None: + root = TreeNode() + frontier = [(0, len(nums) - 1, root)] + while frontier: + left, right, node = frontier.pop() + mid = (left + right) // 2 + node.val = nums[mid] + if left <= mid - 1: + node.left = TreeNode() + frontier.append((left, mid - 1, node.left)) + if mid + 1 <= right: + node.right = TreeNode() + frontier.append((mid + 1, right, node.right)) + + return root + ``` \ No newline at end of file