From 769de902ce428e6864ee23aca762ce6f3f365f63 Mon Sep 17 00:00:00 2001 From: mike <59136831+Mike0121@users.noreply.github.com> Date: Sun, 12 May 2024 02:35:52 +0900 Subject: [PATCH] Create 108. Convert Sorted Array to Binary Search Tree.md https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/description/ --- ...ert Sorted Array to Binary Search Tree.md" | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 "\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/108. Convert Sorted Array to Binary Search Tree.md" diff --git "a/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/108. Convert Sorted Array to Binary Search Tree.md" "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/108. Convert Sorted Array to Binary Search Tree.md" new file mode 100644 index 0000000..e045033 --- /dev/null +++ "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/108. Convert Sorted Array to Binary Search Tree.md" @@ -0,0 +1,149 @@ +### DFS(再帰) + +時間計算量: O(N)
+空間計算量: O(N)
+ +--- +### 1回目 (20m15s) +二分探索のアイデアでいけば書けることはパッと思いついたが、コードにうまくできず時間がかかった。 +以前といた時よりはかなりアイデアそのものは簡単に感じた。 +root.left, root.rightを作って、下から木を構築していく問題がやや苦手だが、今回の問題でかなり克服できたと考える。 +(結果を伝播させていく問題はわかってきた。) + + +```py +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + if not nums: + return [] + + def sorted_array_to_bst_helper(left, right): + if left > right: + return + + mid_index = (left + right) // 2 + root = TreeNode(nums[mid_index]) + + root.left = sorted_array_to_bst_helper(left, mid_index - 1) + root.right = sorted_array_to_bst_helper(mid_index + 1, right) + + return root + + return sorted_array_to_bst_helper(0, len(nums) - 1) +``` + + +### 2回目 +left, mid, rightは、それぞれ_indexをつけるかつけないか統一した方が良いと考えた。 +```python +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + + def sorted_array_to_bst_helper(left, right): + if left > right: + return + mid = (left + right) // 2 + root = TreeNode(nums[mid]) + root.left = sorted_array_to_bst_helper(left, mid - 1) + root.right = sorted_array_to_bst_helper(mid + 1, right) + return root + + return sorted_array_to_bst_helper(0, len(nums) - 1) +``` + +### 3回目 (半開区間に変更) +```python +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + def sorted_array_to_bst_helper(left, right): + if left == right: + return + mid = (left + right) // 2 + root = TreeNode(nums[mid]) + root.left = sorted_array_to_bst_helper(left, mid) + root.right = sorted_array_to_bst_helper(mid + 1, right) + return root + + return sorted_array_to_bst_helper(0, len(nums)) +``` + + +### helper関数なし +--- +```python +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + if not nums: + return None + mid = len(nums) // 2 + root = TreeNode(nums[mid]) + root.left = self.sortedArrayToBST(nums[:mid]) + root.right = self.sortedArrayToBST(nums[mid + 1:]) + + return root +``` + +### DFS (スタック) + +時間計算量: O(N)
+空間計算量: O(N)
+ +再帰をベースに考えて15分ほどで書いた。 +--- +```python +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + if not nums: + return [] + + mid = (len(nums) - 1) // 2 + root = TreeNode(nums[mid]) + node_and_divided_array = [(root, nums[:mid], nums[mid+1:])] + while node_and_divided_array: + node, nums_left, nums_right = node_and_divided_array.pop() + + if nums_right: + mid_right = (len(nums_right) - 1) // 2 + node.right = TreeNode(nums_right[mid_right]) + node_and_divided_array.append((node.right, nums_right[:mid_right], nums_right[mid_right+1:])) + + if nums_left: + mid_left = (len(nums_left) - 1) // 2 + node.left = TreeNode(nums_left[mid_left]) + node_and_divided_array.append((node.left, nums_left[:mid_left], nums_left[mid_left+1:])) + + return root +``` + + +### BFS + +時間計算量: O(N)
+空間計算量: O(N)
+ +--- +```python +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + if not nums: + return [] + + mid = (len(nums) - 1) // 2 + root = TreeNode(nums[mid]) + node_and_divided_array = deque([(root, nums[:mid], nums[mid+1:])]) + while node_and_divided_array: + node, nums_left, nums_right = node_and_divided_array.popleft() + + if nums_left: + mid_left = (len(nums_left) - 1) // 2 + node.left = TreeNode(nums_left[mid_left]) + node_and_divided_array.append((node.left, nums_left[:mid_left], nums_left[mid_left+1:])) + + if nums_right: + mid_right = (len(nums_right) - 1) // 2 + node.right = TreeNode(nums_right[mid_right]) + node_and_divided_array.append((node.right, nums_right[:mid_right], nums_right[mid_right+1:])) + + return root +``` +