diff --git a/tree-bst/108.md b/tree-bst/108.md index e69de29..b20bba6 100644 --- a/tree-bst/108.md +++ b/tree-bst/108.md @@ -0,0 +1,87 @@ +- 問題: [108. Convert Sorted Array to Binary Search Tree](https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/description/) +- 条件 + - `1 <= nums.length <= 10^4` + - `-10^4 <= nums[i] <= 10^4` + - `nums is sorted in a strictly increasing order.` +- 方針 + - 再帰関数というか、2分探索 + - int middle = nums.length / 2 を真ん中とする + - 0 ~ middle までを左に振り + - middle + 1 ~ nums.length までを右に振る + - 上記をひたすら繰り返す + - 時間計算量: `O(log n)` + - 空間計算量: TreeNode を nums.length - 1 分作るので、`O(N)`, 再帰の深さは`O(log n)` + - 時間: 10分 + +```java +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode() {} + * TreeNode(int val) { this.val = val; } + * TreeNode(int val, TreeNode left, TreeNode right) { + * this.val = val; + * this.left = left; + * this.right = right; + * } + * } + */ +class Solution { + public TreeNode sortedArrayToBST(int[] nums) { + if (nums.length == 0) { + return null; + } + return createTreeNode(nums, 0, nums.length); + } + + private TreeNode createTreeNode(int[] nums, int left, int right) { + if (right <= 0 || left >= right) { + return null; + } + + int middle = (left + right) / 2; + TreeNode root = new TreeNode(nums[middle]); + root.left = createTreeNode(nums, left, middle); + root.right = createTreeNode(nums, middle + 1, right); + + return root; + } +} +``` +- 条件が冗長だったので書き直し +```java +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode() {} + * TreeNode(int val) { this.val = val; } + * TreeNode(int val, TreeNode left, TreeNode right) { + * this.val = val; + * this.left = left; + * this.right = right; + * } + * } + */ +class Solution { + public TreeNode sortedArrayToBST(int[] nums) { + return createBST(nums, 0, nums.length); + } + + private TreeNode createBST(int[] nums, int left, int right) { + if (left >= right) { + return null; + } + int middle = (left + right) / 2; + TreeNode newNode = new TreeNode(nums[middle]); + newNode.left = createBST(nums, left, middle); + newNode.right = createBST(nums, middle + 1, right); + return newNode; + } +} +```