题目 96 Unique Binary Search Trees I
Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n?
Example:
Input: 3 Output: 5 Explanation: Given n = 3, there are a total of 5 unique BST's: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
思路
选择一个数字作为根节点,则其左右两侧子树中节点的个数也确定了。左侧子树 种类数 * 右侧子树种类数 = 该根节点树的个数。为根节点遍历所有数字,得到总树个数。
def numTrees(self, n: int) -> int:
if n==0:
return 0
nums = collections.defaultdict(lambda:0)
nums[0] = 1
nums[1] = 1
for i in range(2,n+1):
if i % 2 == 1:
nums[i] = nums[(i-1)//2]**2
for j in range((i)//2):
nums[i] += 2*nums[j]*nums[i-1-j]
return nums[n]
题目 95 Unique Binary Search Trees II
Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ... n.
Example:
Input: 3 Output: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] Explanation: The above output corresponds to the 5 unique BST's shown below: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
思路
用递归,取一个数字作为根节点,所有小于这个数的数组成其左侧的树,大于这个数的数组成其右侧的树。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def generateTree(self,nums):
if len(nums)==0:
return [None]
ans = []
for i in range(len(nums)):
l = self.generateTree(nums[:i])
r = self.generateTree(nums[i+1:])
for li in l:
for ri in r:
root = TreeNode(nums[i])
root.left = li
root.right = ri
ans.append(root)
return ans
def generateTrees(self, n: int) -> List[TreeNode]:
if n==0:
return None
nums = []
for i in range(1,n+1):
nums.append(i)
return self.generateTree(nums)