【leetcode系列】【算法】【中等】不同的二叉搜索树 II(卡特兰数问题))

题目:

题目链接: https://leetcode-cn.com/problems/unique-binary-search-trees-ii/

解题思路:

如果只是求个数,可直接通过卡特兰数递推公式求解:

假设C_{n + 1}是卡特兰数的第n + 1项,则:

C_{n + 1} = C_{0}C_{n} + C_{1}C_{n - 1} + ... + C_{n}C_{0} = \sum _{i = 0}^{n}C_{i}C_{n - i} = \frac {2(2n + 1)}{n + 2}C_{n}\approx \frac {4^{n}}{n^{\frac {2}{3}}\sqrt{\pi }}

其中,C_{0} = 1, C_{1} = 1

其他常见的符合卡特兰数递推公式的例子有:括号化、出栈次序、凸多边形三角划分、n对括号正确匹配数目

所以如果不需要列出所有的例子,只需要从0开始递推,就可以求出任意项的卡特兰数

但是此处需要列出所有例子,所以没办法使用此方法,需要使用递归的方式,遍历所有的可能性

递归时候的思路为:

  1. 选定一个数,作为当前节点值
  2. 使用小于当前值的数字递归调用自己,创建左子树
  3. 使用大于当前值的数字递归调用自己,创建右子树
  4. 向后移动一位作为当前节点值,继续重复循环

代码实现:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def generateTrees(self, n: int) -> List[TreeNode]:
        def create_res(start, end):
            # 如果start > end,说明以及到了叶子节点,直接返回None
            if start > end:
                return [None,]
            
            res = []
            for i in range(start, end + 1):
                # 创建左子树
                left_trees = create_res(start, i - 1)
                
                # 创建右子树
                right_trees = create_res(i + 1, end)
                
                for left in left_trees:
                    for right in right_trees:
                        # 如果是叶子节点,left和right都为None
                        # 之后再向上递归,逐渐创建一系列完整的树
                        node = TreeNode(i)
                        node.left = left
                        node.right = right
                        res.append(node)
                        
            return res
        
        if 0 == n:
            return []
        
        return create_res(1, n)
发布了100 篇原创文章 · 获赞 4 · 访问量 1462

猜你喜欢

转载自blog.csdn.net/songyuwen0808/article/details/105394152
今日推荐