LeetCode解题 Day02

95. Unique Binary Search Trees II

https://leetcode.com/problems/unique-binary-search-trees-ii/


题目介绍:

题目会给你一个数字 n,你要用范围 1 to n 建立所有的二元搜寻树(binary search trees)

Example1:

https://i.imgur.com/SCAVK7c.png


解法:

这题算是很基本的Divide and Conquer,所以有点不知道要打什麽

总之先上程序码吧

# 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 generateTrees(self, n: int) -> List[Optional[TreeNode]]:
        
        def BST(arr):
            
            if len(arr) == 0:
                return [None]
            
            res = []
            for i in range(len(arr)):
                leftTree = BST(arr[:i])
                rightTree = BST(arr[i+1:])
                
                for l in leftTree:
                    for r in rightTree:
                        res.append(TreeNode(arr[i],l, r))
                        
            return res
                
        return BST([i for i in range(1, n+1)])

步骤:

  1. 一开始先列出要建成节点的数字*[1~n]*
  2. 接着按照BST的规则: 左子树所有node的值小於根的值、右子树所有node的值大於根的值,区分要建成左子树和右子树的数字,并建立左子树leftTree和右子树rightTree
  3. 组成所有可能的结构

快一点的解法:

这个方法把输入改成有开头和结尾,并用一个 memory 去记下曾经组过的树,若之後再次遇到同样的开头和结尾,就可以拿出储存值省略一些步骤了

# 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 generateTrees(self, n: int) -> List[Optional[TreeNode]]:
        
        memory = {}
        def BST(start, end):
            
            if start > end:
                return [None]
            if (start, end) in memory:
                return memory[(start, end)]
            
            res = []
            for i in range(start, end+1):
                leftTree = BST(start, i-1)
                rightTree = BST(i+1, end)
                
                for l in leftTree:
                    for r in rightTree:
                        res.append(TreeNode(i, l, r))
                        
            memory[(start, end)] = res
            return res
                
        return BST(1, n)

闲聊:

今天是第二天,题目比昨天简单一点

本来想说竟然都打这篇了,乾脆连他的类似题目Unique Binary Search Trees 也一起打

後来想想算了,过几天後LeetCode可能就把这题当作当天的题目

所以之後遇到再说吧!


<<:  小产品跟大产品都可以通用的决策系统:Randomized AB Test

>>:  DAY2 起手式--Nuxt.js目录结构

[Day13]What is hash?

我第一次听到hash式在资料结构的课堂上,因为它式资料结构很重要的基本概念,同时也广泛运用在区块练...

透过 Kolla-Ansible 跟 Container 部署 OpenStack

OpenStack 早期在部署方面相当复杂也难以维护,但是在近期 DevOps 跟 Containe...

DAY01 前言-学资料科学的小孩不会变坏

一、初次见面请多指教 小编目前大三升大四,一年前开始接触AI这个领域,动机不外乎就是趋势,自从Alp...

DAY 23 Typography, Hover 以及 Extend

随着内容越来越多,结构更加复杂,是时候来整理一下关於字型的配置,这次我们来新增一个 _typogra...

JS DOM(文件物件模型)

DOM(Document Object Model) 文件物件模型 今天简单聊聊之後要进入的主题,D...