leetcode: 树 95,96. Unique Binary Search Trees I II

题目 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)
        
        
发布了45 篇原创文章 · 获赞 1 · 访问量 3357

猜你喜欢

转载自blog.csdn.net/qq_22498427/article/details/104585937