こんにちは
今回の学びは
・ソートされた配列と二分木はよく似てるよ。
・できれば二分木探索を配列で実装していて 🙂
結構ギョッとするタイトルです。
なんだか難しそうですよ。
配列を、バランス型二分木に。。。。
再帰で考えられそう。
なんとなく半分あたりがルートノードになりそうですよね。
それを信じて進めば良い。
一発で通ったので非常に嬉しかったです。
実装前後でこれは毎回書きましょう。timespace anaylysis (時間とスペースの分析)は O(n) ちょっとスタック使ってるし、あリカーし無難でね、OP(n)ですね。
#-*- coding: utf-8 -*- from typing import List class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None import math class Solution: def rec(self, nums: List[int]) -> TreeNode: if nums == None or len(nums) == 0: return None elif len(nums) == 1: return TreeNode(nums[0]) elif len(nums) == 2: bigger = TreeNode(nums[1]) smaller = TreeNode(nums[0]) bigger.left = smaller return bigger elif len(nums) == 3: bigger = TreeNode(nums[2]) mid = TreeNode(nums[1]) smaller = TreeNode(nums[0]) mid.left = smaller mid.right = bigger return mid else: mid = math.floor(len(nums)/2) root = TreeNode(nums[mid]) root.left = self.rec(nums[:mid]) root.right = self.rec(nums[mid+1:]) return root def sortedArrayToBST(self, nums: List[int]) -> TreeNode: # what if nums is null or empty return self.rec(nums) def dfs(node: TreeNode): if node is not None: print (node.val) dfs(node.left) dfs(node.right) samples = [ [-10,-3,0,5,9], ] for sample in samples: ans = Solution().sortedArrayToBST(sample) dfs(ans)
以上です