diff --git a/108-convert-sorted-array-to-binary-search-tree/memo.md b/108-convert-sorted-array-to-binary-search-tree/memo.md new file mode 100644 index 0000000..71991c1 --- /dev/null +++ b/108-convert-sorted-array-to-binary-search-tree/memo.md @@ -0,0 +1,10 @@ +## step1で考えたこと +root nodeをどう決めるか? => numsの中央値を取る? + +Binary Searchが使えるわけではなさそう? + +middleが中心のIndexとなるからそれの一個ずらした左右のIndexをleft, rightとして、端に寄せていくイメージ + +## step1に対するフィードバック +- bst.left = nums[left] / bst.right = nums[right] って int を入れてしまっていて、TreeNode をつないでない(木になってない) +- そもそもどんどん左に、右にnodeを増やしていったらそれはHeight-Balancedではないのでは? diff --git a/108-convert-sorted-array-to-binary-search-tree/step1.py b/108-convert-sorted-array-to-binary-search-tree/step1.py new file mode 100644 index 0000000..adf1341 --- /dev/null +++ b/108-convert-sorted-array-to-binary-search-tree/step1.py @@ -0,0 +1,31 @@ +# step1で書いたコード(動かないコード) + +# 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]: + middle = len(nums) // 2 + bst = TreeNode(nums[middle]) + # middleの両隣のindexをleft, rightとする + left = middle - 1 + right = middle + 1 + + while left > 0 or right < len(nums) - 1: + if left < 0: + break + else: + bst.left = nums[left] + left -= 1 + + if right > len(nums) - 1: + break + else: + bst.right = nums[right] + right += 1 + + return bst + \ No newline at end of file diff --git a/108-convert-sorted-array-to-binary-search-tree/step2.py b/108-convert-sorted-array-to-binary-search-tree/step2.py new file mode 100644 index 0000000..c435df7 --- /dev/null +++ b/108-convert-sorted-array-to-binary-search-tree/step2.py @@ -0,0 +1,22 @@ +# step1の書き方に一番近い、正解のコード +# 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 + + middle = len(nums) // 2 + bst = TreeNode(nums[middle]) + + left_nums = nums[:middle] + right_nums = nums[middle + 1:] + + bst.left = self.sortedArrayToBST(left_nums) + bst.right = self.sortedArrayToBST(right_nums) + + return bst diff --git a/108-convert-sorted-array-to-binary-search-tree/step3.py b/108-convert-sorted-array-to-binary-search-tree/step3.py new file mode 100644 index 0000000..b0f2d18 --- /dev/null +++ b/108-convert-sorted-array-to-binary-search-tree/step3.py @@ -0,0 +1,20 @@ +# 最適解のコード + +# 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 buildBST(left: int, right: int) -> Optional[TreeNode]: + if left > right: + return None + + middle = (left + right) // 2 + root = TreeNode(nums[middle]) + root.left = buildBST(left, middle - 1) + root.right = buildBST(middle + 1, right) + return root + return buildBST(0, len(nums) - 1) \ No newline at end of file